In this case, I would not use User Settings to override the System/Context Settings the provide a default value. Instead, I would use your own $_SESSION and/or $_COOKIE and/or $_REQUEST variables to override System/Context Settings for this. The problem is User Settings for anonymous users don’t work the same and setOption is only a temporary change for the current request cycle (it does not change any values in database OR session).
Here is an example of how to override using a SESSION variable and System Setting called ’lang’
<?php
$lang = $modx->getOption('lang', $_SESSION, 'en');
Or similarly, to override by COOKIE, GET or POST values...
<?php
$lang = $modx->getOption('lang', $_REQUEST, 'en');
Then all you need to do is set the appropriate SESSION, COOKIE, GET, or POST variable to override System/Context settings, and provide a default in the absence of the Setting.