Does anyone here use dynamic arrays effectively with some favorite heap implementation that can be used on top of basic, stack-like arena allocation?
I don't understand exactly what you mean. If you want a general heap allocator, make one that fits your needs. If your goal is to make dynamic arrays then you can probably have a specific allocator for that instead of a general heap allocator since array contain fixed size elements. There probably isn't one thing to solve all you memory problems.
One thing I do for memory space that can grow is to use VirtualAlloc to reserve (not commit) a big space and committing in block when the memory needs to grow (for example reserving 1Gio and committing by blocks of 1Mio). That way when the memory needs to grow, it doesn't need to move and the pointers don't change. You still have a upper bound to the size, reserved memory cost a bit of memory and you don't want to call VirtualAlloc too often.