I believe I found the root ; CPowerManager::OnSleep/OnResume can get called in re-entry, at least on some targets ; ref https://github.com/xbmc/xbmc/blob/master/xbmc/powermanagement/osx/CocoaPowerSyscall.cpp#L234
https://github.com/xbmc/xbmc/blob/master/xbmc/powermanagement/windows/Win32PowerSyscall.cpp#L82
(unsure about other targets)
*
Now I can think of a few ways to fix this;
1) as you suggested, redo WakeOnAccess::ProgressDialog-display to handle re-entrancy. There is a drawback here ;  implementation gets complicated! (and OnWake/OnResume still gets fired recursive which may be problematic by itself)
2) fix setting of "m_OnSuspend/m_OnResume" variables in files listed above.. drawback : will we get all?
3) detect & handle nesting here ; https://github.com/xbmc/xbmc/blob/master/xbmc/powermanagement/PowerManager.cpp#L222
and https://github.com/xbmc/xbmc/blob/master/xbmc/powermanagement/PowerManager.cpp#L240

I prefer 3) - what is your thoughts?