buenas,
fijate que a diferencia del codigo codigo original, en este ultimo ejemplo
a1 tiene el valor de 29 mientras que
a2 tiene como valor -1. por tanto es distinto y al final evalua a true.
Código:
var a1 = 29, a2 = -1, pa = 0, es = 0;
(a1 > 0) || (a2 > 0) && (pa != 0) && (es != 0);
true || false && false && false;
// primero se evalua las operaciones AND, por tanto la secuencia de AND devuelve el primer false, marcado en bold ;
true || false;
// el resutlado de la expresion anterior es true ;