Лучше всего вообще избегать совместного использования потоков и асинхронщины. Есть есть веские основания их совмещать, то лучше стремиться к тому, чтобы у каждого потока был свой цикл событий, так как он не является потокобезопасным.
Во-первых, стоит определиться всё-таки многопоточно или multiprocessing. Во-вторых, ваш синхронный код скорее всего расположен на верхнем уровне исходного кода, а потом выполняется, когда multiprocessing создаёт новые процессы скрипта.
Cython - это транслятор, он только переводит питонячий код в сишный. Дальше вы должны использовать компилятор C для компиляции в бинарник. Это требует как минимум базовых знаний в C и умении использовать его инструментальные средства. В идеале же стоит знать хорошо и язык, и принципы работы виртуальной машины Python. Проще говоря, не стоит ожидать от Cython простой компиляции питонячьего кода в бинарники.
События графического интерфейса обрабатываются бесконечным циклом, который запускается, когда вы вызываете app.exec() Его нельзя останавливать, иначе приложение зависнет. Но ваш цикл именно это и делает, останавливает цикл обработки событий окна.
Всё логично, переменная vibor_typ при запуске содержит строку 'Тип фигуры ?', эта строка не равно строке "2", вход в условное выражение не осуществляется, скрипт завершается.
from itertools import zip_longest
with open('first_file.txt') as f1, open('second_file.txt') as f2:
for a, b in zip_longest(f1, f2):
if a != b:
print('Файлы не равны')
break