libbeat buffers events in memory (configurable via queue_size). Once queues are full, it waits querying for new stats until some more space is available in the buffer.
We're considering some enhancements to the publisher pipeline in libbeat (including disk-based persistent queues). e.g. this ticket: https://github.com/elastic/beats/issues/575
Without disk-based queue, you can either have metricbeat write events to file (file output) or kafka for your buffering needs.