IIRC, PSC is buffered (and so will be ATRLR if you enable TIM_ARPE) and only takes effect when the next update event occurs. So in your timer initialisation you need to generate one using UG in SWEVGR.
To expand on why failing to do this results in the timer 'not working properly', two things are happening:
- PSC doesn't get the right value loaded, so counter runs too fast on the default prescaling of 1.
- ATRLR doesn't get loaded either, so stays with zero value, effectively disabling the timer.