Нашел то место, где портится переменная. Там всё правильно. Вот эта процедура. procedure TfrReport.DoGetValue(const ParName: String; var ParValue: Variant);
begin
if Assigned(FOnGetValue) then
FOnGetValue(ParName, ParValue);
end;
Внутри этой процедуры параметр parname еще не испорчен, а после вызова FOnGetValue - ParName портится. Прикол оказался в том, что в модуле unit1 тип string в методе ongetvalue интерпретируется, как ansistring, а в unit2,unit3 ... как shortstring. Самый простой способ добиться правильной работы - указать тип вместо parname:string - parname:ansistring.
procedure TForm2.frReport1GetValue(const ParName: AnsiString; var ParValue: Variant);
begin
if parname='edit_text' then parvalue:='test';
end;