As I said the language is set on runtime via url on front-end, before it gets to your template, as you found out this is the LanguageSupportPageNames module doing this. The language is set to the $user->language at runtime before rendering.
So
$user->language
$pages->get($user->id)->language
are the same thing at that time. No matter what is saved to the user.
If you change the user language in your template and save the user, the user has that checked in backend. But then all following output would be changing language, even if the requested URL would indicate english, text and links would be german.
Everything works as expected here. Maybe you can tell a little more what you're trying to achive?
I think you got a lot mixed here adding to the confusion. I guess you get the user in two different ways, and that something is still cached and not loaded again.