Wiem, że kiedy VARCHAR(MAX)/NVARCHAR(MAX)kolumny są używane, dane są przechowywane poza wierszem ...
W rzeczywistości zależy to od ustawienia large value types out of rowopcji, którą można ustawić za pomocą sp_tableoption. Z dokumentacji :

Domyślny jest dla MAXwartości, które mają być przechowywane w wierszu , do 8000 bajtów, jeśli pasuje. O ile nie sp_tableoptionzmieniłeś ustawień domyślnych, Twoje MAXdane najprawdopodobniej będą przechowywane w rzędzie.
To powiedziawszy, złą praktyką jest używanie MAXtypów danych dla wartości, które nigdy nie przekroczą 8000 bajtów - zamiast tego należy używać typu innego niż MAX. Oprócz czegokolwiek innego, wydajność jest często znacznie niższa w przypadku MAXtypów, ponieważ SQL Server musi być przygotowany do radzenia sobie z danymi, które mogą mieć rozmiar do 2 GB.
Czy każde pole jest przechowywane poza wierszem, czy tylko te maksymalne?
Tylko MAXte. Ponadto, jeśli MAXkolumna poprzednio w wierszu zostanie przeniesiona poza wiersz, dotyczy to tylko tej kolumny w tym wierszu. Jest on zastępowany w wierszu wskaźnikiem do struktury poza wierszem LOB. Istnieją również okoliczności, w których kolumny inne niż MAX mogą zostać przeniesione poza wiersz.
Jeśli używasz indeksu klastrowego tabeli do odczytu całego rekordu, czy pola przechowywane poza wierszem również są odczytywane?
Skanowanie indeksu klastrowego przegląda tylko dane w wierszu. Jeśli dane do zapytania poza wierszem są potrzebne, są one wyszukiwane za pomocą wskaźnika w wierszu.