I would like the first-order headings to start on a new page. If the new page is an even page, then a blank page should be inserted. The first-order headings should therefore always be on an odd-numbered page. In addition, I would like to have a vertical space above and below the heading.
You just need to put a weak page break before the heading in a show rule. This will insert a blank page, only if the current page even or not empty. For spacing above the heading, you can wrap it in a a padding element. For spacing below, you can either also put it in the padding, or use a separate show-set rule to set the block spacing. I would prefer the latter to ensure that it correctly interacts with other potential spacings between heading and content, but both are probably fine:
#show heading.where(level: 1): set block(below: 1cm)
#show heading.where(level: 1): it => {
pagebreak(to: "odd", weak: true)
pad(top: 2cm, it)
}