They mean AsyncLocal<T>, which ties its storage to the current thread-local ExecutionContext. When await schedules a continuation, the ExecutionContext flows with it and is set before resuming, so the AsyncLocal values flow through async methods even if the task switches threads.
This is extremely similar to thread local, a feature in many languages including C#.
I'm pretty sure they were talking about AsyncLocal<T>, which is not quite the same as ThreadLocal (values are persisted even when an async flow transitions across).
Yes it’s different but conceptually similar in the sense of ambient execution context.
I prefer implicit variables like scala has but it gets the job done in C#.