You could try replacing these lines 344 and 345 in teensy_loader_cli.c
Code:
char reboot_command = 134;
int response = usb_control_msg(serial_handle, 0x21, 0x20, 0, 0, &reboot_command, 1, 10000);
with these
Code:
char reboot_command[] = {0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08};
int response = usb_control_msg(serial_handle, 0x21, 0x20, 0, 0, reboot_command, sizeof reboot_command, 10000);
and seeing if it makes a difference. That's what I've done in Raspbian to get the soft reboot to work with my Teensy 4.x's. Now, granted, under Raspbian the unaltered code got past the open_usb_device() call that you say you're getting caught on, and then died with a broken pipe error on the usb_control_msg() call. Still, it's easy enough to try and see if it makes a difference in your situation.