This is true only if you ignore thread locals. Otherwise the async block could both store a clone of the Rc in a thread local of the original thread and keep another instance internally to use later on.
The problematic situation seems to be when:
- the asyncblock captures a!Send + SendNoEscapevalue;
- it uses such value to create another !Send + SendNoEscapevalue;
- it drops/consumed the original captured value;
- all of this happens before the first await;
- the new value is then held across a await.
Is this correct? If it is then I don't see where's the breaking change. Even with precise capturing this Future will be !Send because the new value is still !Send and is held across an await point.
Your rule also seems too restricting, as it should probably apply only when a  Edit: nevermind this is wrong!Send + SendNoEscape value is held across a .await. With this it's clear that it should never happen to situations where a Future is currently Send.
In general I would expect any SendNoEscape proposal to allow strictly more code than the equivalent with only Send bounds. As such there should be no examples that compile with Send bounds (even after precise capturing) but don't with SendNoEscape.