Se può servire a qualcuno, ho risolto il problema spostando il comando ShellExecute() dopo aver chiuso il secondo begin...end, quindi:
codice:
procedure TfrmVisResp.btnMailingListClick(Sender: TObject);
var
gname, mail, gmail:string;
begin
while not DMSsn.Referenti.eof do
begin
gname:=DMSsn.ReferentiEMAIL.AsString;
gmail:=trim(gname)+';';
DMSsn.Referenti.Next;
ListBox1.Items.Add(gmail);
if ListBox1.Items.Text<>';' then
begin
mail:=trim(ListBox1.Items.Text);
end;
end;
ShellExecute(Handle, 'open', PChar('mailto:'+mail), nil, nil, SW_SHOWNORMAL);
end;