When preemptive Threads were introduced, the understanding was that you could not protect code that was being simultaneously accessed in preemptive and cooperative threads because the classes that are meant to protect it (Semaphore and CriticalSection) had to be set to match the Thread.Type.
That was then.
It is still true that Semaphores cannot be used among mixed Thread types, but a CriticalSection can if its Type is set to Preemptive.
To be really clear, if you create a CriticalSection and set its Type to Preemptive, it can be called from either a preemptive or cooperative Thread without raising an error, and will serve to protect a code block when called from either, or both simultaneously.
The Xojo documentation was updated recently to reflect this, and the change should make it easier to convert Threads in stages, or just mix preemptive with cooperative Threads.
Because preemptive Threads can execute on any available core, they do not share memory with each other nor with your app as cooperative Threads do. This means the code in the Thread will have no access to the values of any other objects in your app.