One difference between ‘weak let’ and a hypothetical ‘lazy let’ is that the latter requires mutable ownership over the value to read the property while the former does not. So this might be more confusing to teach, for sure.
At the implementation level, we could make ‘lazy let’ work easily enough; it would still desugar to a computed property with a mutable getter, and it would continue to behave as one, so nothing would violate the law of exclusivity.
However, in my opinion, this use case would be better serviced by macros, instead of generalizing either lazy properties or property wrappers.