What's happening instead is that imageFetcher.read() either returns a string OR throws a promise; it never returns a Promise.
So <Component foo={fooFetcher.read(...)} /> either gets instantiated with the fetched Foo, or throws so React.createElement(Component, ...) never gets called in the first place.
Only if you physically throw a Promise (or "thenable") does the new logic apply: https://github.com/facebook/react/pull/12279/files#diff-1996... is called inside an exception handler.
You should keep a distinction between exceptions that means "error" and exceptions that means "some kind of event happened", and handle them accordingly.
At the end of the day it’s just a control flow mechanism. And theoretically, if you lack data needed to render, it’s an exceptional condition.