My (possibly naive) suggestion, which of course you're free to ignore if it's not possible or useful to you:
It sounds as if you can substitute your own printf() function for the one the library uses.
If so, good: what I'd do is in your replacement function, save the printf() arguments to your RAM, in a globally-accessible location.
You'll need a little data structure that includes the # of arguments, easy to implement.
When your printf() gets called, set a global flag indicating "there's data that needs to be printed".
Then, in another process or loop that runs when the CPU is idle, go through your list (array) of data structures and print them with the "back half" of your printf(), the one that actually outputs the data.
Let me know if I'm just plain wrong about this. (Wouldn't be the first time.)