As Stefano pointed out on this topic, the delay routine touches SysTick timer in the STM32_USB-FS-Device_Lib for STM32F105-7. It causes unpredictable error on RTOS.
For Keil RL-RTX, os_dly_wait() fits to this purpose well.
uDELAY(5) is used in these routines,
otgd_fs_cal.c: twice in OTGD_FS_CoreReset(), OTGD_FS_FlushTxFifo(), OTGD_FS_FlushRxFifo()
uDELAY() is too short to replace with os_dly_wait(), which runs on system tick. You may need to write a custom routine, which polls STK_VAL of SysTick timer or other one.
Thanks Tsuneo, that seems to have resolved the issue. Although some care is needed in the implementation since the delay can be called form an interrupt context.
The USB I/O now seems robust, however simply connecting the USB cable still affects the performance and functionality of other tasks in my application, so I shall need to investigate further.