В Python потоки довольно сложны и работают в одной и той же куче памяти. Потоки в основном работают одновременно, то есть несколько потоков чередуются вместе, так что только при запуске выполняется одновременно, и они вместе работают альтернативно в очень короткие промежутки времени (учитывая, что им нужен доступ к интерпретатору).
Когда вы переводите поток в спящий режим, он в основном использует базовые функции спящего режима системы и блокирует все операции с ним. Тем не менее, другие потоки, безусловно, работоспособны. Таким образом, когда вы говорите, что THREAD1 находится в спящем режиме до того, как он собирался получить доступ к глобальной переменной, очевидно, что другие потоки будут использовать эту переменную, потому что они работают, а THREAD1 - нет.
Как только THREAD1 активизируется, при необходимости он получит GIL и, таким образом, получит доступ к глобальной переменной. Так как он снова чередуется с другими потоками, из-за параллелизма он получает немедленный доступ к глобальной переменной после активации. Если бы другие потоки использовали его, они бы отказались от доступа до того, как THREAD1 начал операции.