Tom,
You are right, the boundry timer-event won't be fired since it never ends up in the DB for the jobexecutor to pick up. So putting a timer on a non-waitstate in activiti is quite useless.
You could work around this using some subprocess and waitstate-magic I guess, but seems best to handle this in your service-code.
Once asyncronous continuations are available in activiti, the boundry timer would work, if the service-task is execute asynchronously (timer will be comitted). But currently no concrete timing on that, so I'd stick with the Java-solution.