The stack grows up on a dsPIC: FreeRTOS-Kernel/portmacro.h at V10.4.6 · FreeRTOS/FreeRTOS-Kernel · GitHub
The compiler and linker determine where variables get allocated, so whether using FreeRTOS or not, dynamic variables will normally end up on the stack (or possibly just in a register, depending on its size and the compiler optimisation level). If that isn’t the case then look in the map file to see if the variable got allocated somewhere else, and/or in the assembly code to see how the compiler is using the stack on function entry and how the function is accessing the variable. It might be the compiler is doing some fancy optimisation to minimise stack use - which would be worrying as that would also make it non thread safe.