Re-reading the comments I think I might have been slightly confused, but fwiw the PE->Unix calls are mostly just about passing ImmProcessKey to the drivers (and really just winemac at the moment).
Yes, I think the solution for Unix->PE is fine. Passing ImmProcessKey through win32u would need a bit of abuse, but I guess it could be something like `NtUserMessageCall( himc, IME_MSG_PROCESS_KEY, vkey, key_data, key_state, NtUserIMEMessage, FALSE )`. You could then have a single driver entry point like `LRESULT pProcessIMEMessage(void *handle, UINT msg, WPARAM wparam, LPARAM lparam, void *param)`, abstracting IME message details from core win32u.
I'm not sure what you mean by very integrated with win32u. Exposing builtin IMEs as "normal" IMEs is not affected by changes that I suggest. For driver interface, it would just replace one driver entry by another.