Sorry not to answer this sooner – I’ve been thrown out somewhat by the forum software being updated and then having to re-register to get notifications of people posting.
This topic has been discussed a few times, you should be able to find it in the archive on the FreeRTOS.org website.
Basically the key to this is that each task maintains its own context, and a context switch cannot occur if the variable is non zero. So, as long as the writing from the register back into the memory is atomic, it is not a problem.
In your example, consider the following scenario, which starts with uxSchedulerSuspended at zero.
/* This load stores the variable's value in a register. */
load uxSchedulerSuspendeded into register
... Now a context switch causes another task to run, and
the other task uses the same variable. The other task
will see the variable as zero because the variable has
not yet been updated by the original task... Eventually
the original task runs again. **That can only happen
when uxSchedulerSuspended is once again zero**, and when
the original task runs again the contents of the CPU
registers are restored to exactly how they were when it
was switched out - therefore the value it read into the
register still matches the value of the
xuSchedulerSuspended variable ...
/* The value will be incremented to be equal to 1. */
/* The value restored to uxSchedulerSuspended will be the
correct value of 1, even though the variable was used
by other tasks in the mean time. */
store register into uxSchedulerSuspendeded