Never underestimate append/3:
subst(This, That, MyStr, Result) :-
append(This, After, Rest),
append(Before, Rest, MyStr),
!,
subst(This, That, After, AfterResult),
append([Before,That,AfterResult], Result).
subst(_, _, S, S).
To test:
103 ?- portray_text(true).
true.
104 ?- subst(`this`,`that`,`athishellothis`,R).
R = `athathellothat`.
But yes, especially if you have atoms or strings to begin with and portability is not a goal, re_replace/4 is probably a simpler and more efficient choice.