In Exchange 2010, you can define Database Availability Groups and have your mailbox database(s) automatically replicated between multiple servers, and you can have mailbox server which are members of a DAG also host other server roles, such as Hub Transport and/or Client Access (which wasn't possible with Exchange 2007).
But can you define an array of Client Access Servers on the same two servers which are members of a DAG? The documentation I've found states quite clearly that you can't use NLB with DAGs due to incompatibilities with the cluster service... or, that you can try to set it up, but it would be an unsupported scenario.
What about using a hardware load balancer? Or a reverse proxy which can publish multiple internal servers on the same external URL (such as ISA)? If NLB is not used on the two servers and another balancing solution is implemented, can then full high availability of all main Exchange services (Mailbox, Hub, CAS) be achieved with only two servers?