1) Nie musisz, a wręcz nie powinieneś. Wystarczy użyć samego BeginThread
2,3) cCtrl::BeginThread zachowuje się identycznie jak __beginthreadex, z tą jedną różnicą, że dla utworzonego wątku włącza przechwytywanie błędów. Utworzone tą drogą wątki obsługujesz więc zupełnie standardowo...
Przy okazji kAQQ chyba nie używa BeginThread, stąd brak przechwytywania krytyków. Nie ma to nic wspólnego z niekompatybilnością c++

2) BeginThreadAndWait nie jest najlepszym rozwiązaniem do wykorzystania. Chyba że jest to na prawdę uzasadnione. Do czego chcesz go wykorzystać?
3) Robisz własną obsługę wątków. Czyli zapamiętujesz w swojej aplikacji, które wątki uruchomiłeś, przy IM_END rozsyłasz sygnał/ustawiasz flagę, że wątki powinny się elegancko zakończyć, i czekasz aż wszystkie otwarte wątki zostaną zakończone.
O ile pamiętam przykład takiego kodu znajdziesz w kTransfer, dwutlenek chyba też ma coś podobnego...