В принципе, разобрался с cx_freeze, как всегда нужно было немного повнимательнее прочитать документацию. Нужно было при написании setup.py добавить вот такую штуку:
executables = [
Executable('win1.py'),
Executable('win2.py'),
Executable('win3.py')
]
и передать ее в функцию setup():
setup(name="name",
version="0.0.1",
description="lalala",
options={"build_exe": build_exe_options},
executables=executables)
В конечном итоге получается 3 .exe файла, причем из главного окна, как и задумано, осуществляется переход в другие 2. Конечно, есть решение более изящное, но его я пока не нашел.
UPD.
Если не нравится способ с созданием отдельных .ехе файлов, то вот вам альтернатива.
меняем executables с того, что написан вверху на :
executables = [
Executable('win1.py', includes=['win2.py', 'win3.py'])
Теперь у нас есть один замечательный exe, в котором все работает))))