AfxBeginThread возвращает CWinThread*
, и MFC предполагает, что он будет управлять дескриптором, связанным с потоком.
Таким образом, чтобы безопасно использовать дескриптор напрямую, вам необходимо продублировать его, иначе, когда поток завершится, MFC может закрыть дескриптор до того, как вы перейдете к вызову WaitForSingleObject.
Если бы вы работали напрямую с Win32 CreateThread API, то вы наверняка могли бы подождать непосредственно с возвращенным дескриптором.