> If you load a main.py that has an infinite loop (common on micro controllers because there is no os)
Whether a loop is infinite or not doesn't depend on the presence of an OS. Were you thinking of "tight loop"? Now since Python is interpreted, the loop will never be all that tight, interrupts will still be handled. If you experienced that a ^C from the (USB attached) serial console didn't interrupt the program, that warrants further investigation methinks.
The problem arises when you develop your main.py by always running it over usb where you can (usually) ^C out of problems. Then as you near completion you actually upload main.py to the pi pico to see how it will work in the field running off a battery. Turns out you neglected some detail or other and it doesn't work as desired so you bring it back to the computer and as soon as you give it usb power it locks up, long before you can even try to attach a USB console.
Not my experience (MicroPython v1.15 on a Raspberry Pico board from 2020) using Thonny. Note that main.py is loaded by the MicroPython interpreter after boot.py and long after initializing USB.
I did have trouble with reconnecting using MS Windows 10, but that's a Windows USB driver thing. No problems on Linux (Ubuntu 18.4).
Whether a loop is infinite or not doesn't depend on the presence of an OS. Were you thinking of "tight loop"? Now since Python is interpreted, the loop will never be all that tight, interrupts will still be handled. If you experienced that a ^C from the (USB attached) serial console didn't interrupt the program, that warrants further investigation methinks.