Laut Doku (SQL-Handbuch) gehört die IBM diesbezüglich tatsächlich erschlagen!

Schaut man sich den Callstack mal so an, dann ist die letzte Ebene beim File-IO immer QDBPUT/QDBGET.
Bei Native-IO genauso wie bei SQL.
Beim Lesen wird also immer der gesamte Datensatz bereitgestellt, beim Schreiben der gesamte Datensatz erwartet. Zusätzlich gilt immer noch die Regel, dass die Satzlänge (ohne LOB's) ja max. 32KB ist.
Also muss ich im Umkehrschluss alle VARCHAR's mit ALLOCATE(Defined-Size) definieren damit diese eben im Satzbereich und nicht extra gespeichert werden.
Platz sollte hier nicht ausschlaggebend sein.

Die IBM sollte den Default für ALLOCATE irgendwie so setzen können, dass dies immer gilt.
Man bedenke, dass beim Lesen immer die gesamte Datenzeile zur Verfügung gestellt wird. Also zusätzliche IO's für den Varchar-Bereich immer durchgeführt werden.
SQL entnimmt dann die benötigten Variablen aus diesem Puffer bzw. stellt sie beim Update dort hin.
RPG/LE macht dies genauso, in dem die verwendeten Felder per Move aus dem Puffer in die Variablen übertragen werden (auch wenn eine DS definiert ist!) und beim Update wieder zurück.
COBOL arbeitet direkt mit dem IO-Puffer.

Fazit:
Wenn also Performance gewünscht wird, so muss man bei Create Table / CRTPF für Varchar/Nvarchar die Allocate-Klausel auf das Maximum setzen!