Is it possible that not all of the initialisation has completed? (despite me calling this on the UI thread)
If you are using a multi-threaded message loop you are on YOUR app's UI thread, but not the CEF UI thread. I haven't look through the code, but I suspect in this case CefInitialize is kicking off said 'other (UI) thread' and that thread is doing all the bootstrapping work. In this case I would suspect that CefInitialize may return rather quickly and you would then have a race between the initialization work being completed and your posted UI task being run on CEF's UI thread. If the initialization is multi-phased and event driven (as I suspect it would be) then it seems highly likely your posted message will be handled before all of that completes.
Have you looked into something like implementing CefLifeSpanHandler and doing the check in OnAfterCreated? Intuitively it seems by the time the CefBrowser object is created that it should know about things like availability of Flash, etc..., though that is just idle speculation.
Ryan