Assuming your properly handling exceptions thrown in the child process, I have also seen this happen when my child process did not notify the parent using the correct key.
The key specified on the pub.sync:notify must match exactly the key specified on the pub.sync:wait. A best practice is for this key to be unique within your given Integration Server instance.
If an incorrect key is used the parent will never receive the results of the child thread and will throw the timeout exception. In initial development, I usually write a message to a log file just before invoking the pub.sync:notify service.
Mark
#Integration-Server-and-ESB#webMethods#Flow-and-Java-services