This is exactly why (and not only this) show-set rule is preferred over show rules. They also have different semantics, so the actual issue here is why #show table: it => { set table(stroke: red); it } does work.
Basically, show-set rule is a filter-apply rule, but show rule is a filter-override/wrap rule.
#show heading: set heading(numbering: "1.") will apply heading rule for all headings, but #show heading: it => { set heading(numbering: "1."); it } will wrap all headings by adding set heading(numbering: "1.") to headings, but since you are already in a show rule (where heading is/can be constructed), it will not apply, because it’s too late for adding more styling for what you already have (it, which is immutable).
This is why you sometimes have to fiddle around with wrapping stuff in a specific way or reconstructing elements with additional behavior, dodging infinite show rule recursion.
So, in general, it is not possible to have an applied element set rule inside a show rule for the same element.