One reason is to avoid subnets with high load. See the difficulties that overloaded subnets have caused recently. The other reason I see is when you develop a canister that integrates tightly with a service that is mainly located in a specific subnet. Cross-subnet calls take significantly longer to process (~4 extra consensus rounds in the best case), so choosing to have your canister on the same subnet as the service you’re integrating with can cause significant performance improvements
AFAIK, subnet metadata is mostly in the registry. Don’t ask me how to query it though. I have no idea about that