MFCは良く知らんけど、Win32APIではモーダルダイアログの終了には
return の前に EndDialog を明示的に呼び出す必要がある。
これはモーダルダイアログのウィンドウプロシージャはOSの内部にあるからだ。
(アプリケーションのウィンドウプロシージャがアプリ自身の中にあるのと異なるという意味ネ)

で、MFCにもCDialog::EndDialogがあり、OKとキャンセルではデフォルトで呼ばれるけど
それ以外の場所から終わるときにはこれを呼ぶ必要があるとmsdn様が…