Esto realmente depende de la cantidad de anidamiento que uses. Después de todo, puede usar resultados de funciones directamente en expresiones para mejorar la legibilidad. Tanto el código que no usa expresiones anidadas (como el código ensamblador) como el código que usa demasiadas expresiones anidadas son difíciles de leer. Un buen código trata de encontrar un equilibrio entre los extremos.
Así que veamos algunos ejemplos. El que diste en tu pregunta me parece bastante legítimo, así que no hay de qué preocuparse aquí. Sin embargo, una línea como
foo(bar(baz(moo, fab), bim(bam(ext, rel, woot, baz(moo, fab)), noob), bom, zak(bif)));
Definitivamente no sería tolerable. Del mismo modo, código como
double xsquare = x*x;
double ysquare = y*y;
double zsquare = z*z;
double xysquare = xsquare + ysquare;
double xyzsquare = xysquare + zsquare;
double length = sqrt(xyzsquare);
tampoco sería muy legible. sqrt(x*x + y*y + z*z)
es mucho más fácil de entender, aunque combina un total de seis operaciones diferentes en una sola expresión.
Mi consejo es que prestes atención a las expresiones que aún puedes analizar fácilmente en tu cabeza. En el momento en que necesita echar un segundo vistazo para comprender lo que hace una sola expresión, es hora de introducir una variable adicional.