Sé que cuando VARCHAR(MAX)/NVARCHAR(MAX)se usan columnas, los datos se almacenan fuera de la fila ...
En realidad, eso depende de la configuración de la large value types out of rowopción, que se puede configurar usando sp_tableoption. De la documentación :

El valor predeterminado es que los MAXvalores se almacenen en fila , hasta 8000 bytes, si encajan. A menos que haya utilizado sp_tableoptionpara cambiar el valor predeterminado, sus MAXdatos probablemente se almacenarán en fila.
Dicho esto, es una mala práctica usar MAXtipos de datos para valores que nunca excederán los 8000 bytes; en su lugar, use un tipo que no sea MAX. Además de cualquier otra cosa, el rendimiento a menudo es significativamente peor cuando se trata de MAXtipos, porque SQL Server debe estar preparado para hacer frente a datos que pueden tener un tamaño de hasta 2 GB.
¿Cada campo se almacena fuera de la fila o solo los máximos?
Solo los MAXunos. Además, si una MAXcolumna de la fila anterior se mueve fuera de la fila, solo esa columna de esa fila se ve afectada. Se reemplaza en fila por un puntero a la LOBestructura fuera de fila . También hay circunstancias en las que las columnas que no son MAX pueden moverse fuera de la fila.
Si está utilizando el índice agrupado de la tabla para leer el registro completo, ¿también se leen los campos almacenados fuera de la fila?
El escaneo del índice agrupado solo atraviesa datos en fila. Si se necesitan datos fuera de la fila para la consulta, se busca utilizando el puntero en fila.