Let's say I have VM1 and VM2, using the service WS.cloudapp.com. Let's say I have an web app that has been depployed in both VM1 and VM2 in port 80. Because I'm not yet set up load balancing, so, for the port 80, only one VM can own, let's say VM1. When VM1 is down, end users also can not connect to WS.cloudapp.com. That lead to configuration high availability set is useless, isn't it?
You are correct. If you didn't setup LB endpoints the second VM will never receive requests. The ONLY purpose of availability set is to guarantee that at least 50% of your VMs in the same set will be provisioned in different physical hardware racks to avoid planned (or unplanned) maintenance events to affect all your VMs at the same time.
Availability Set must be combined with Load Balancer to guarantee 99.95% SLA . Combining the Azure Load Balancer (or any customized failover solution) with an Availability Set will guarantee the most application resiliency. One rules where the VMs will be provisioned physically and the other rules which VMs will receive public traffic.
There's also a problem you should be aware of that i quoted below:
Avoid single instance virtual machines in Availability Sets
Avoid leaving a single instance virtual machine in an Availability Set by itself. Virtual machines in this configuration do not qualify for a SLA guarantee and will face downtime during Azure planned maintenance events. Also, if you deploy a single virtual machine instance within an Availability Set, you will receive no advanced warning or notification of platform maintenance. In this configuration, your single virtual machine instance can and will be rebooted with no advanced warning when platform maintenance occurs.
https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-manage-availability/