とりあえず重要そうなとこだけ抜粋してみました。
ひょっとかしたら根本的な間違いがあるかもしれませんが。
// グローバル変数
volatile bool exitflag;

int WINAPI WinMain()
{
    (中略)
    hThread = reinterpret_cast<HANDLE>(_beginthread(childThread, 0, NULL));
    (中略)
    // 終了処理
    exitflag = true;
    WaitForSingleObject(hThread, INFINITE);
    return 0;
}

void childThread(void *arg)
{
    (省略)
    while(!exitflag){
        // いろいろな処理
    }
    if(exitflag)
        return;
    (省略)
    while(!exitflag){
        // いろいろな処理
    }
    return;
}
最適化なし、プログラムサイズ最適化はスレッドが終了しますが、
実行速度最適化にするとスレッドが終了しないようです。