MSDN упоминает, что «Когда поток завершается, объект потока достигает сигнального состояния, удовлетворяя любые потоки, которые ожидали на объекте».
Итак, вы можете проверить, завершился ли поток, проверив состояние дескриптора потока - независимо от того, сигнализирован он или нет:
DWORD result = WaitForSingleObject( hThread, 0);
if (result == WAIT_OBJECT_0) {
// the thread handle is signaled - the thread has terminated
}
else {
// the thread handle is not signaled - the thread is still alive
}