I suspect your TFO parameters are wrongly defined. There is roughly only one set of values that will function properly when HR is activated in your network.
These are the correct ones:
EN_TFO = Enable
EN_TFO_AMR_WB = Enable (are you using that yet ??)
EN_TFO_MATCH = Enable
EN_TFO_OPT = Disable
FORCE_TFO_HR_WHEN_LOADED = 1 (TFO HR only)
FORCE_TFO_VS_AMR = 0 (disabled)
KEEP_CODEC_HO = 0 (free choice of the codec)
Keep Codec HO = free choice means that when MS is in FR and goes into a loaded cell, then it’ll probably get a HR channel (= it will get the codec allocated by the BSC). Then, thanks to the TFO_Match, the other MS will downgrade to HR (if it was previously in FR also), so that both sides are in HR. TFO will then resume.