Look at the ThreadLocal source and you'll see it stores all your ThreadLocal objects in what basically amounts to hash map of weak references. The reason set(null) is called is that since it's assumed that Servlet instances/threads are being re-used to handle incoming requests, since that's how containers are supposed to do it, you can avoid the bit of overhead of fully removing the whole thread id key and map value done in remove() by just nulling out the thread local value associated with the thread id.
Since ThreadLocal uses a weak reference for the keys of its internal ThreadLocalMap too, even if your servlet threads are eventually killed off and replaced by new threads they and their thread locals should be able to be garbage collected.
I would see if you dig deeper and see what that thread local map is actually storing (jmap / jhat are your friends), perhaps your persistence or injection framework is leaving behind thread locals, I don't think it's GWT's remote service servlet though.