We found a solution.
CiviCRM will create a zero invoice (as indicated by @Ramesh in the comments).
But we found that webform_civicrm doesn't create a Civi contribution (and hence no invoice) if totalContribution evaluates as true (not 0).
To fix it my dev changed the file includes/wf_crm_webform_postprocess.inc
In webform_civicrm version: 7.x-5.8 it's at line 165.
Changed this
if (empty($this->ent['contribution'][1]['id']) && **$this->totalContribution**) {
$this->createDeferredPayment();
}
to this
if (empty($this->ent['contribution'][1]['id']) && **count($this->line_items**)) {
$this->createDeferredPayment();
}
$this->totalContribution refers to the total amount after adding up the line items (when contribution amount is used it serves as a line item)