Risolto.
In pratica serve una funzione che permetta il libero scorrimento dei messaggi:
codice:
int PumpMessages(void)
{
    MSG msg;
	
    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)
    {
        if (AfxGetApp()->PumpMessage() == FALSE)
        {
            AfxPostQuitMessage(0);
            return FALSE; 
        }
    }
    
    // let MFC do its idle processing
   LONG lIdle = 0;

   while (AfxGetApp()->OnIdle(lIdle++) == TRUE);

   return TRUE;
}
e chiamarla modificando il codice così:
codice:
CMyDlg::OnButton1()
{
	if (p==0)
	{
		p=1;
		c=AfxBeginThread(MyControllingFunction,this,0,0, CREATE_SUSPENDED, NULL);
		c->m_bAutoDelete=FALSE;
		c->ResumeThread();
		return;
	}
	
	if(p==1)
	{
		p=0;
		do{
		PumpMessages();
		}while(WaitForSingleObject(c->m_hThread,0)!=WAIT_OBJECT_0);
		delete c;
		return;
	}
}