You can set up a conditional show rule for the outline entries to add the colon depending on the outline target. This allows you to just exclude the outline entries of headings.
On another note, your show rule for the outline entry with a colon was missing the link to the element, see the docs on “Building an entry”.
#let colon-entry(it) = {
link(
it.element.location(),
it.indented([#it.prefix():], it.inner())
)
}
#show outline: out => {
show outline.entry: it => if out.target == selector(heading) { it } else { colon-entry(it) }
out
}