No it is not correct.
Using malloc on an AVR for any purpose is definitely incorrect, because it doesn't make any sense. See this. In addition, how does it even make sense to have the stack residing on the heap?
If you need RTOS-like behavior, it means you already picked the wrong MCU for the task. 8-bitters are just far too limited. At a minimum, use a Cortex-M0 for such programs.
That being said, if you want to make your own simple task-switching OS just for the sake of learning, then you would reserve stack space at compile/link-time. This is done through the linker files of your cross-compiler environment. Check how and where the ordinary stack was allocated and then create a custom memory segment of similar size. You'll note that there is not a whole lot of RAM to play with at all.
It is correct that your stack pointer would be at an offset of the stack size. But if you are truly writing an OS, then you wouldn't be allocating the SP as some sort of C pointer, but rather you would let the CPU use the actual SP register.
Also note that setting the stack pointer is one of those things that simply can't be done in C. You must do so through assembler.