まあ要するにスレッド同期が上手く行ってないんですね。
そういうのはスレッドの設計があまりよろしくないと思います。
今のままで解決する方法もあると思いますが思い切って設計変えたほうが楽な気がします。

こういうタイプの実装方法って主に3つパターンあると思うんですが
1)1スレッドに1イベントと1バッファを割り当てる
2)1スレッドで全イベントを管理、イベント発生したら対応バッファを処理、終了したら次のイベントを待機
3)1スレッドで全イベントを管理、イベント発生したら待機スレッドを起動、対応バッファを割当、そのスレッドでバッファを処理

1番と3番はスレッドが複数必要で同期要りますが、2番のスレッドは1つです。
MsgWaitForMultipleObjectsを使ってイベントを待ちましょう。この関数の注意点は310の通りです。