> I try to add a call to io_service.run() after the timer async_wait:
 
Why? You already run io_service within io_worker_thread(), don't you?
What you have to do is just:
...expires_from_now(...);
...async_wait(...);