I agree, you should be able to use malloc().
I have been working on a personal replacement for HardwareSerial. If you only call begin(), it uses no buffers and no interrupts. Even sketches with some input work since they tend to read in a tight loop and the serial hardware has a two level input buffer register and an input shift register.
I have two calls to connect interrupts with buffers, one call that uses malloc and sets a status bit to remember to call free and one call to use static arrays in the sketch.
bool connectInterrupt(size_t rxSize, size_t txSize); // uses malloc
bool connectInterrupt(uint8_t* rxBuf, size_t rxSize, uint8_t* txBuf, size_t txSize);
If a buffer is zero length, the corresponding RX or TX will not use interrupts.