The following code seems to be quite efficient for my use case:
# Save tensors each output
netG.eval()
with torch.no_grad():
    pred_val = netG(fixed_target)
netG.train()

f_path = Path(f"./progress/batch_outputs.h5")
if not f_path.exists():
    f = tables.open_file(str(f_path), mode='w')
    atom = tables.Float64Atom()
    batches_ea = f.create_earray(f.root, 'batches', atom, shape=(0, *pred_val.shape))
else:
    f = tables.open_file(str(f_path), mode='a')
    f.root.batches.append(pred_val.unsqueeze(0).cpu().numpy())
f.close()

Adapted from python - save numpy array in append mode - Stack Overflow