It is by design of MFC: CWinApp::OnIdle and CWinApp::Run are called only after the CWinApp::InitInstance returns TRUE. But in a dialog based App InitInstance returns after the dialog exits, so it doesn't make any sense call Run nor OnIdle.
Instead the dialog uses its own message loop (but without OnIdle). You can, however, implement you own "idle" processing using WM_KICKIDLE (or/and WM_IDLEUPDATECMDUI) message. See
http://msdn.microsoft.com/en-us/magazine/cc301466.aspx
http://www.microsoft.com/msj/0797/c0797.aspx