Я знаю, що при VARCHAR(MAX)/NVARCHAR(MAX)використанні стовпців дані зберігаються поза рядка ...
Власне, це залежить від налаштування large value types out of rowпараметра, який можна встановити за допомогою sp_tableoption. З документації :

За замовчуванням для MAXзначень , які будуть зберігатися в построчно , до 8000 байт, якщо вони підходять. Якщо ви не використовували sp_tableoptionдля зміни стандартних MAXданих , ваші дані, швидше за все, зберігатимуться в рядку.
З огляду на це, поганою практикою є використання MAXтипів даних для значень, які ніколи не перевищуватимуть 8000 байт - замість цього використовується тип, не MAX. Крім усього іншого, продуктивність часто значно слабша при роботі з MAXтипами, тому що SQL Server повинен бути готовий впоратися з даними, розміром яких може бути до 2 Гб.
Чи зберігається кожне поле поза рядка чи лише максимум?
Тільки MAXті. Крім того, якщо попередньо MAXстовпець, що перебуває в рядку , переміщений поза рядком, впливає лише цей стовпець у цьому рядку. Він замінюється в рядку вказівником на структуру поза рядків LOB. Також є обставини, коли стовпці, що не містять MAX, можуть бути переміщені поза рядком.
Якщо ви використовуєте кластерний індекс таблиці, щоб прочитати весь запис, чи читаються також поля, які зберігаються поза рядком?
Сканування кластеризованого індексу проходить лише в рядкових даних. Якщо для запиту потрібні дані між рядками, вони шукаються за допомогою вказівника рядка.