To screw up with a data race you need
A: at least 2 threads
B: accessing the same memory location
C: at potentially the same time
D: with at least one of them writing.
As soon as you break one of the requirements you're safe. For example (A) using only 1 thread makes it safe. (B) Keep separate ECSs for separate threads. (C) Using locks. (D) Keeping the ECS read-only.
You can switch between strategies, but all threads have to use the same strategy at every point in time.