Olvide tu segunda pregunta.
En C, cuando un expresión da como resultado cero, entonces se considera falsa. Agradezcamos que en C++ hay tipo booleano
Cual es el valor de una asignación? Pues el valor que tenga la variable asignada después de la asignación.
En el ejemplo que pones, cuando s2 apunte a cero (caracter nulo) la asignación *s1=*s2 pasa el cero a *s1 y la condición se evalua con ese valor. Y como es cero, entonces se rompe el ciclo.
Creo que strcat usa un algoritmo así.
Saludos