Could the USB module include time data with its output? Since it's meant to be high speed I'd imagine it comes with some facility like that. If you can do that then you can just poll for data as slow as the UI needs to be updated.

Otherwise, yea, you pretty much need another thread. Then when events are fired for all manner of reasons, it should still be able to keep your code running while those events are being handled. Unlike DoEvents which stops to handle them all. Still it's not guaranteed, Windows isn't a real-time OS so you can never be sure how fast applications will run.