Note: all of this behavior is handled behind a resilience barrier, so it can be kept up to date with any changes in the OS and ObjC conventions.
Hah, yes, tagged pointers can have associated objects. Pointer identity is derived from the bit pattern of the pointer itself, so that means that all "copies" of a tagged pointer string with the same contents have the same identity, and they all share the same associated objects. Since this identity is tied to just some bits rather than a managed memory address, such associated objects become effectively immortal.
When we bridge in tagged pointer NSStrings, we eagerly unpack them into our small string to hit all our fast-paths. When we bridge them back out to ObjC, e.g. to check for associated objects, we form tagged pointer NSStrings, whereupon they automatically regain their associated objects due to their identity-sharing.