USART interrupt handler is invoked only once

Right, and the function disables the interrupts for interrupts at the logical priority of configMAX_SYSCALL_INTERRUPT_PRIORITY or lower (values equal or higher) so it will be disabled, as required to use the API but only during the critical section.

This means it will not occur within a critical section, as FreeRTOS WILL disable it during that time.

From the problems you are seeing, if it is locking up after the vPortExitCritical, that the action of enabling those interrupts is allowing some ISR to run that is doing something to crash your processor (What I find the normal cause of the debugger not giving you eather a run / step / or pause/break option.)