Das Problem ist tatsächlich, dass der separate Varlen-Bereich nichts mit dem RGZPFM zu tun hat.
Dieser Bereich wird intern verwaltet und aus dem Satz verpointert.
Der RGZPFM entfernt halt nur gelöschte Sätze und schiebt den Bereich dann zusammen, wobei die Verpointerung erhalten bleibt.
Der Varlen-Bereich kann natürlich auch zu großen Lücken führen (ähnlich zu Memory-Leaks), wenn häufig Varlen-Felder geändert werden und in den damit freien Bereichen keine passende Größe gefunden wird.
Kleiner bekommt man diese tatsächlich nur per CPYF, allerdings nur wenn man die Anzahl Sätze (siehe obiger Link) dann mit angibt.

Alternativ geht es dann auch per SQL (in etwa so):
create mynewtable as
select * from myoldtable
with data

Was mir allerdings bei den Indizes nicht so hilft.

Beim Erstaufbau aus Altdaten ist der
insert into MyNewFile
select ..., rtrim(fx), ...
from MyOldFile
zu empfehlen.