hCheckBoxがローカル自動変数であるかどうかは完全には明らかではありません。もしそうならCreateWindow、WM_COMMAND メッセージが受信された時点まで、その値が保持されていないことを保証できます。代わりにこれを使用してください:
LRESULT chk = SendDlgItemMessage(hDlg, IDC_CHECKBOX_CTRL_ID, BM_GETCHECK, 0, 0);
hDlgダイアログまたはメイン ウィンドウのハンドルはどこにありIDC_CHECKBOX_CTRL_ID、はコントロール ID です。そのためには、作成呼び出しの HMENU パラメータにコントロール ID をゼロ以外の値として指定する必要があります。
hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE | 
    WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
    WS_TABSTOP,150,323,300,20,hwnd, IDC_CHECKBOX_CTRL_ID, hInstance,0);
そして、それが明らかでなかった場合。IDC_CHECKBOX_CTRL_ID をゼロ以外の整数として定義します。
編集 
コントロールが正しく設定されていると仮定すると、このチェックボックスの WM_COMMAND を WndProc で次のように処理できるはずです。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    switch (message)
    {
    case WM_CREATE:
        CreateWindowExA(0,"Button","Random text", WS_CHILD | WS_VISIBLE | 
            WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
            WS_TABSTOP,100,100,300,48, hWnd, (HMENU)IDC_CHECKBOX_CTRL_ID, hInst, 0);
        break;
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        if (wmId == IDC_CHECKBOX_CTRL_ID)
        {
            if (wmEvent == BN_CLICKED)
            {
                LRESULT chkState = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
                if (chkState == BST_CHECKED)
                    MessageBoxA(hWnd, "Checkbox is checked!", "CheckBox", MB_OK);
            }
            break;
        };
        // fall-thru intentional
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    };
    return 0;
}
これを、空白のウィンドウを備えたストックの汎用WIN32アプリに叩きつけました。結果は以下の画像です。
