I've been dealing with this bug for a while now and have only found one reference to it
Using SetClientName in CS:GO works fairly well, except if the old name is a substring of the new name starting at index 0, the scoreboard will favor the old name anyway, making it very hard to perfectly force aliases.
// old name in ("e", "ex", "exa", "exam", "examp", "exampl")
// old name will still be used in scoreboard
The only way I've found of getting around this is prepending a random unicode symbol that doesn't draw properly and hoping the old name doesn't also start with it. However, it's not pretty and I would definitely prefer another option if there is one.
I know that FaceIT have successfully figured out how to force aliases without this bug, so it's not impossible.