Creo que el problema viene dado porque en la segunda vez que intentes convertirlo el separador de millares no es compatible y arroja una excepción, por lo que propongo la siguiente solución guardar el número en una variable y actuar sobre ella:
Código:
procedure TForm1.Button1Click(Sender: TObject);
var
MiNumero:Double;
begin
MiNumero:=strToFloat(StringReplace(ed.Text,ThousandSeparator,'',[rfReplaceAll]));
ed.Text:=FormatFloat('#,##0.00', MiNumero);
StringReplace(Ed.Text,',',' ',[rfReplaceAll]);
end;
Un Saludo.