Pour la première question, il n'y a pas de problème tant que vous supprimez les variables ThreadLocal à la fin de chaque appel. Ceci est important car les conteneurs (servlet ou ejb) utilisent généralement des threadpools et réutilisent donc des threads, ce qui a deux effets : un "appel" peut voir des informations threadlocal provenant d'un appel précédent, et si vous retirez une application du conteneur sans arrêter la JVM, certaines classes peuvent ne pas être ramassées car elles sont toujours référencées par un thread du conteneur. Il faut donc placer les données dans un threadlocal dans un bloc try / finally et les supprimer dans la partie finally.
Voici un billet montrant une façon de résoudre le problème : ThreadLocal dans les applications web
Pour la deuxième question, comme les données sont locales au fil de l'eau, elles ne viendront pas avec un appel à distance, vous devez ajouter un paramètre à vos interfaces, extraire les données locales au fil de l'eau d'un côté et les recréer de l'autre côté...