у меня чем то похожая загвоздка, правда не совсем. Короче, ситуация такая:
имеется глобальное событие , которое задумано использоваться для сообщения потоку о том, что надо бы завершиться.
HANDLE event=::CreateEvent(0,1,0,0);
запускаю поток, так:
::AfxBeginThread(thread1,event);
 в качестве параметра передаю хендл на событие, событие в этот момент сброшено, поток такой:
//поток для постоянного чтения сообщений
UINT thread1(LPVOID param)
{
	HANDLE event=(HANDLE)param;
	for(;;)
	{
		Sleep(1000);
		//смотрим, не надо ли выйти
		::AfxMessageBox("проверка на выход из потока",MB_SYSTEMMODAL);
		if(WAIT_OBJECT_0==::WaitForSingleObject(event,0))
		{
			::AfxMessageBox("выход из потока",MB_SYSTEMMODAL);
			break;
		}
	}
	return 0;
}
по нажатию на кнопку завершаю поток выставлением события, для эксперимента делаю так:
	Sleep(5000);
	::SetEvent(event);
	Sleep(5000);
	::AfxMessageBox("10 сек после нажатия прошло",MB_SYSTEMMODAL);
запускаю программу, появляется сообщение о запуске потока, затем в потоке, как и ожидается, раз в секунду появляется окно с сообщением (проверка на выход из потока).
Жму на кнопку - зависает всё , и основной процесс (ну это вроде так и должно быть) и ПОТОК (?) , потому что во время слипа 5 секунд окошко в диалоге не выскакивает, потом , когда выставляется событие, ждётся ещё 5 секунд - по истечении всех 10 секунд выясняется, что поток всё это время так и висел, ибо после этого он благополучно сообщает - 
"проверка на выход из потока",
"выход из потока",
что я не правильно делаю? Или так нельзя делать ?