First, the resource:
It might seem an obvious suggestion, but did you go through
Mastering the FreeRTOS™ Real Time Kernel, available at the FreeRTOS site?
It is not updated to the latest version (10.x - the book covers 8.x) but it's nonetheless a very good introduction (not only to FreeRTOS).
Then, the question:
If you only rely on the FreeRTOS tick, you can't, as you might have imagined.
The scheduling granularity goes with the tick - in general.
That said, there's a way: you can use an HW timer set to generate a periodic interrupt, and in the interrupt handler use e.g.
vTaskNotifyGiveFromISR() to wake up your task, waiting on a
ulTaskNotifyTake().
Note the
fromISR part, that allows the API to be called from an ISR, and forces a reschedule.
If the sleeping task has a high enough priority, it will be immediately scheduled.
I'm suggesting to use a direct notification since they have much smaller overhead with respect to queues or semaphores.