Drop semantics and temporary value lifetimes in while let

No, they can't be dropped as soon as the statement ends, because if they were then the lock guard would be released meaning that the mutex would be allowed to aquire a new lock which creates aliasing unique references. One from this loop and another from the new mutex lock.
The current behavior is correct.

Also a match statement doesn't operate on values, but on places (a very subtle difference), this allows things in EXPR to be alive for the entire match statement. And allows this behavior.

let x : &[_] = &[0, 1, 2];
match *x {
    _ => ()
}

Even though *x is !Sized so it can't be on the stack!

No, the internals forum is for design work of Rust itself or about the compiler, not general questions about the language.