I just looked this up for amusement's sake. Turns out it's actually because of a bugfix.
We set it up so people who have no legs won't get 'naked' thoughts from not wearing pants. It checks if any of the pawn's not-missing body parts are in the BodyPartGroupDef called Legs. If not, it thinks the pawn has no legs, so it sets 'hasPants' to true since the check isn't needed.
Animal bodies don't have BodyPartGroupDefs configured because they're only used for apparel. Thus the check for not-missing body parts in the Legs BodyPartGroup always returns false.
So the reason animals always think they have pants is because they always think they have no legs.