Ele não testa a segunda, porque ele não tem motivo para testa-la. O código só é executado se as duas condições forem true por conta do operador &&, então se a primeira for falsa ele nem se dá ao trabalho de testar a segunda.
Os operadores && e || são short-circuit, ou seja, eles só analisam o mínimo necessário.
No caso do &&, a expressão só é verdadeira se ambas as condições forem verdadeiras.
Então se a primeira for falsa, nem adianta avaliar a segunda, pois já é certeza que o resultado será false. Somente se a primeira for verdadeira, aí sim ele precisa avaliar a segunda, para saber se ambas são verdadeiras.
Por isso que no seu caso ele só avalia a(). Como ela retorna false, então a expressão já será falsa, e aí ele nem avalia b().
Se a() retornasse true, aí sim ele precisaria avaliar b().