Grade das macht ja nur Sinn wenn der wartende Thread ("Thread 2") sonst keine Aufgabe hat.
Naja, wenn Thread 2 permanent irgendwas macht und nur zwischendurch Daten von Thread 1 verarbeiten soll, dann würde ich vermutlich einfach einen Boolean anlegen, der komplett von Thread 1 kontrolliert wird. Die Daten würde ich dann auch im Thread 1 zwischenlagern (Stream, Queue, etc.). Thread 1 schaut nun während seiner permanenten Aufgabe z.b. einmal pro Loop, ob der Boolean true ist und verarbeitet dann 1-n Pakete aus der Queue.
Edit: Ansonsten kannst du auch Events "peeken", indem du das Timeout von WaitForSingleObject auf 0 setzt und den entsprechenden Rückgabewert auswertest.