Используй threading.Event.
import threading
def run(stop: threading.Event):
while not stop.wait(timeout=1.0): # ожидание и проверка сигнала о завершении
schedule.run_pending()
stop_event = threading.Event()
worker = threading.Thread(target=run, args=(stop_event,))
worker.start()
#когда надо остановить поток worker
stop_event.set()
Прелесть такого подхода в том, что цикл прервётся немедленно по сигналу stop_event, а не тогда, когда закончится очередное ожидание. Также можно заставить несколько потоков использовать один и тот же объект Event.