The framing I use with my team: a subquery that references the outer row is not a query, it is a for loop. Once people hear it that way they stop writing them without thinking.
Window functions cover most of the cases people reach for a correlated subquery for, and they run in one pass. Top-scoring per group, first per group, running totals, all of it.