Add items to batch queue operations on the fly
I was really quite close! As always, asking the question on here caused the answer to reveal itself.

function example_drush_sync_entries() {
  $batch = array(
    'operations' =&gt; array(
      array('_example_fetch_data', array())
    ),
    'finished' =&gt; '_example_batch_finished',
    'title' =&gt; t('Processing'),
    'progress_message' =&gt; '',
    'error_message' =&gt; t('The update has encountered an error.'),
  );

  batch_set($batch);
  $batch = &amp;batch_get();
  $batch['progressive'] = FALSE;

  drush_backend_batch_process();
}

function _example_fetch_data(&amp;$context) {
  $response = drupal_http_request('http://blah.com/data');
  $data = $response-&gt;data;
  $data = drupal_json_decode($data);

  $batch = &amp;batch_get();
  $batch_next_set = $batch['current_set'] + 1;
  $batch_set = &amp;$batch['sets'][$batch_next_set];
  foreach ($data as $entry) {
    $batch_set['operations'][] = array('_example_process_entry', array($entry));
  }
  $batch_set['total'] = count($batch_set['operations']);
  $batch_set['count'] = $batch_set['total'];

  _batch_populate_queue($batch, $batch_next_set);
}

function _example_process_entry($entry, &amp;$context) {
  var_dump($entry['id']);
}


Notable differences:
* The operations need to be added to the next set, not the current one.
* You need to define a total and count, otherwise the percentage progress is considered 100% and, therefore, complete before it even starts.

I hope this helps other people :)