If you use the rfIgnoreCase flag in StringReplace then first both string parameters get uppercased before replacement takes place.
Unfortunately, the uppercase of "ringel-S" is "SS", and the lowercasing will obviously result in "ss".
So, in this case do the replacing of lowercase ß first (exclude the rfIgnoreCase), and then do the rest of the conversion in a second step.
Untested:
S := 'Ossenkoppeler Straße 60 ESSIG';
S := Utf8StringReplace(S, 'ß', ' ß', [rfReplaceAll]);
//if you want to replace ss with xx:, note that this is now safe since there is no more Ringel-S in S
S := Utf8Stringreplace(S, 'ss' 'xx', [rfReplaceAll], rfIgnoreCase);
//if you want other coversions, like pp -> qq
S := Utf8Stringreplace(S, 'pp' 'qq', [rfReplaceAll, rfIgnoreCase]);
Bart