OK here is the explanation:
When the string is a ByteString, then the primitives do the right thing: they use the instanceVariable characterToGlyphMap which map ascii 95(+1) to (xTable at: 129) - that is underscore rather than leftArrow.
Some example of StrikeFont method which does the right thing:
#widthOf:
When the string is a WideString (you pasted some wide character once, the string remain wide even if you delete the character), then several methods of StrikeFont triggered by presence of a WideString
DO THE WRONG thing: they access xTable directly with a Character charCode ignoring characterToGlyphMap.
Some example of not well behaved StrikeFont methods:
#hasGlyphOf: #glyphOf: #glyphInfoOf:into: #characterFormAt: ...
Generally, all users of xTable not refering to characterToGlyphMap (except methods for reading/constructing the font maybe...)
I will try to fix, but it's possible that this could cause some more surprise, code was changed 12 years ago by Yoshiki, and incorrect usage has spread a bit since then...