I believe that is because &'a T is a different type than &'b T even though the user might expect them to both just be &T and therefore cause confusion, because the chance of two lifetimes being exactly the same is unlikely.
I don't think lifetimes could possibly be encoded into the TypeId (how do you differentiate between iterations of the same loop, or calls to the same function?).
This means that, if non-'static types supported it, then TypeId::of(&'a T) == TypeId::of(&'b T), and anything relying on TypeId for correctness (such as Any) could then be used to transmute lifetimes.