As we know, currently we can only pass a totally struct of esb_payload to this function and then it will be copied to payload queue internally. Normally, this process would take 2 times memory copy at least.
Maybe you can add an new interface similar as esb_write_data(uint8_t pipe, const uint8_t * data, uint8_t length, uint8_t noack)? You can then pick an instance from the payload queue and fill the struct items directly. I think it will be more efficient.