"No preference (default subnet in any Availability Zone)" is only available for the Default VPC (and only for AWS accounts that do not support EC2-Classic). This option is not available for non-Default VPCs.
The reason is for legacy compatibility with EC2-Classic (even if your AWS account does not support it).
When you launch an EC2 instance (whether by command line, SDK, or GUI), the
ec2:RunInstances command takes as input a subnet ID (and not a VPC ID). In the AWS Management Console, you do select a VPC, but that's only to filter the subnet selection control. The VPC selected does not make its way to the
In the past, the subnet ID was optional, and if omitted, would launch the new EC2 instance in EC2-Classic (ie. outside of any VPC). So in the past, if you wanted the instance launched in a VPC, you must specify a subnet ID.
With newer AWS accounts, AWS has removed support for EC2-Classic and replaced it with the "Default" VPC. To keep software/scripts/etc. backward-compatible with EC2-Classic accounts, omitting the subnet ID is still permitted in newer AWS accounts and would launch the EC2 instance in the Default VPC in a default subnet.
But aside from all that, they want you to specify a subnet ID when launching in an VPC.