Right, I agree. What I decided to try was to wrap the whole long-running task in its own thread, start that thread in the ActionHandler, and just allow the ActionHandler to return normally ASAP. As you suggested, I have a polling solution to get status on that long-running process.
For anyone who is interested, the approach I used to check progress was to have each java.util.concurrency.Callable that is executing on the "batch thread" write its progress, as an attribute keyed by string batchID, to the user's HttpSession object . Then, a separate polling GWTP Action run by a timer on the client can check process status by looking up that key. So far, it works great!