関数の全ソースを載せておきます。
Test8(下のソース)を20回ぐらい連続して呼び出すと、
Test6と同じぐらいの速度になりました。
さっぱり分かりません。 Test6は↓にあります。
ttp://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=049229

procedure Test8(var S : string );
var
 ConvTbl: array[Word] of Word;
 I, Count, Len: Integer;  P: PWord;
begin
 for I := low(ConvTbl) to High(ConvTbl) do   ConvTbl[I] := I;
 ConvTbl[PWord(PChar('AC'))^] := PWord(PChar('CA'))^;
 ConvTbl[PWord(PChar('AT'))^] := PWord(PChar('TA'))^;
 ConvTbl[PWord(PChar('AG'))^] := PWord(PChar('GA'))^;
 ConvTbl[PWord(PChar('CA'))^] := PWord(PChar('AC'))^;
 ConvTbl[PWord(PChar('CT'))^] := PWord(PChar('TC'))^;
 ConvTbl[PWord(PChar('CG'))^] := PWord(PChar('GC'))^;
 ConvTbl[PWord(PChar('GA'))^] := PWord(PChar('AG'))^;
 ConvTbl[PWord(PChar('GC'))^] := PWord(PChar('CG'))^;
 ConvTbl[PWord(PChar('GT'))^] := PWord(PChar('TG'))^;
 ConvTbl[PWord(PChar('TA'))^] := PWord(PChar('AT'))^;
 ConvTbl[PWord(PChar('TC'))^] := PWord(PChar('CT'))^;
 ConvTbl[PWord(PChar('TG'))^] := PWord(PChar('GT'))^;

 P := Pointer(PChar(S));
 Count := Length(S) div 2;
 asm
  pusha
  mov ecx, Count
  mov esi, P
  lea edi, ConvTbl
  xor eax, eax
 @@Loop:
  mov ax, [esi]
  mov ax, [edi + eax]
  mov [esi], ax
  add esi, 2
  dec ecx
  jnz @@Loop
  popa
 end;

 Len := Length(S);
 if not Odd(Len) then
 begin
  case S[Len] of
   'A': S[Len] := 'T';
   'T': S[Len] := 'A';
   'G': S[Len] := 'C';
   'C': S[Len] := 'G';
  end;
 end;
end;