`WaitScope` has a method called `poll()` which checks for new I/O and handles it without blocking. Maybe you can get away with calling that from time to time.
If that doesn't work, then it sounds like you may need to implement your own kj::EventPort to use in place of kj::UnixEventPort. A custom event allows you to integrate with some other event loop. You will end up needing to implement your own AsyncIoStream based on this. For an example of something similar, you could look at how node-capnp implements a custom event port that uses libuv's event loop (in order to integrate with Node); see the first part of this file:
Obviously, that's a fair amount of work, so hopefully the `poll()` approach gets you what you want.