Das ist eben das Problem an synchronem IO: Du kannst nicht auf äußere Signale reagieren. Ab Windows Vista könntest du vom Hauptthread aus mit
CancelIoEx den Thread zurückholen. Eleganter - und auch früher unterstützt - wäre es, auf asynchronen IO umzustellen, d.h. das File-
Handle mit dem entsprechenden Flag zu öffnen und bei ReadFile dann eine Overlapped-Struktur zu verwenden. Mit WaitForMultipleObjects kannst du dann gleichzeitig auf das Overlapped-Ereignis und ein Stopp-Ereignis warten. In StopThread setzt du einfach das Stopp-Ereignis und der Thread kehrt praktisch sofort aus WaitForMultipleObjects zurück und beendet sich.