Judging from the RoboVM source, if you can call into Objective-C then you should be able to provide callbacks. Obviously this must be possible, otherwise how would the UIKit bindings work?
https://github.com/robovm/robovm/blob/master/cocoatouch/src/main/java/org/robovm/cocoatouch/uikit/UIActivity.javaFrom this thread, I see that the devs are working on radically simplifying the boilerplate needed to bind:
https://groups.google.com/forum/m/#!topic/robovm/3ApzrPuQh4M
The new syntax looks a LOT simpler! In particular, note that you can call into Objective-C and pass blocks. So, you would:
1) Have the "shell" be in Java as I guess that's what RoboVM makes easiest. The shell would use WalletAppKit to configure and start up bitcoinj.
2) After that, or in parallel, construct an Objective-C class representing your application GUI. Call methods on it (or set properties) passing blocks into the Obj-C side that it can use to control bitcoinj.
3) Once the UI has all the callbacks it needs, call into a app.run() type method on the Obj-C side, and at that point the Obj-C code takes over and sets up and starts handling the GUI. Button event handlers and the like use the blocks provided earlier to pass control back into Java.
Now, the latest on that thread (from yesterday) is that it doesn't seem to be working yet, though the dev said he wanted to have something by next week. So you could jump on that thread and express your interest along with your use case.
At any rate, it looks like RoboVM is definitely the way to go: it seems to be actively developed and they're making the Java/Obj-C interop a lot cleaner and work better.
For now if you don't want to wait for the auto-binding stuff there's another way. Create two Objective-C (or maybe just plain C?) functions. Init bitcoinj on the Java side as before, then create a Java thread that calls the first GetCommand C function. On the native side, block the thread on a command queue of some kind (i.e. the iOS equivalent of a LinkedBlockingQueue). When it pops something off the queue, it's returned into the Java side as a byte array or struct that represents the "command". The command thread reads the command, converts it into Java calls and manually handles the marshalling back and forth. Once that thread is spun up, call into the second Objective-C function to pass control on the main thread to the native side: this function will return only when the app is about to quit.
In your position I would wait and see what the RoboVM guys come up with. Having their magic compiler generate the marshalling glue for you would be a lot more convenient and result in cleaner code. Whilst you're waiting, you could just mock out a bitcoinj adapter class on the Objective-C side and start work designing your UI.