Tapestry configures a few PerThread values for Web requests including the Request and Response. These Services will be null for non-web threads so you'll probably need to pass read only values to the Runnable on the non-web thread. Note that servlet containers re-use request and response objects so don't pass them between threads (unless you like headaches).
If you want to manage your own threads, you'll need to call PerthreadManager.cleanupThread() explicitly to make sure any PerThread services (eg hibernate session) are tidied up. If you use the PeriodicExecutor or ParallelExecutor you don't need to call cleanupThread().