Se intendi qualcosa del genere:
codice:
    Private Sub Timer1_Tick() Handles Timer1.Tick
        obj.Read(N byte) //--> if no data come within 500ms close the thread
    End Sub
ogni 100ms il programma verifica l' IF del tuo codice, non ho la possibilità di provare ma per la mia poca esperienza credo che non vada tanto bene...
Penso che dovresti gestire i 500ms direttamente con il Timer "giocandoci" con Start e Stop, tipo:

codice:
 
    Private Sub avvio_acquisione() Handles Button1.Click
        acquisizione()
    End Sub
    Private Sub acquisizione()
        'qui il tuo codice
        Timer1.Start()
    End Sub
    Private Sub Timer1_Tick() Handles Timer1.Tick
        Timer1.Stop()
        If acquisizione_dati = True Then
            'qui devi attendere la fine dei dati, qualcosa tipo WaitForExit
            acquisizione()
        Else
            ' qui devi chiudere il thread
            acquisizione()
        End If
    End Sub
Devi anche aggiungere del codice per fermare definitivamente il timer.
Comunque la mia è solo un' idea dettata dal quel che conosco, ti conviene aspettare qualcuno più esperto...