The user.name field is moved into each thread. Since &'static str is Copy that is ok.
Note that "drogus" compiles down to a reference into an immutable global that holds the actual bytes. The immutable global lives forever, so it's okay to access it from other threads.
Rust doesn't have copy constructors. Copying and moves in Rust are always equivalent to a memcpy (just copying the shallow bytes around). Moves invalidate the place that was moved from to avoid things like the double-free I mentioned. Copies do not.
So you can only add Copy to structs that meet certain requirements, and String doesn't meet those requirements. String can't be Copy as that would result in a double-free. (Rust has no language level garbage collection and Strings are deallocated when dropped.) You can only implement Copy for types whose fields are also Copy. They can't involve Drop types or exclusive references or anything else that would cause memory problems, etc.
If a foreign type doesn't implement Copy, you can't make it Copy and can't make any local type which owns one Copy either.
Vec implements Drop and thus cannot be Copy, no matter what its fields are. (RawVec too.)
Moreover, all those private fields and structs are implementation details. Hacking something together to get something with added guarantees (like a trait implementation) which an upstream library hasn't provided you themselves would be wildly unsound. In this case, "no way to make use of it without UB" levels of unsound; the compiler itself (i.e. the language) depends on the guarantees of the Copy trait.
I.e. there is no solution. The language doesn't allow it.
The Extend block has nothing to do with this conversation; that's about copying data into a Vec, not the Vec itself.
But that would be completely wrong. You are completely ignoring the requirement for managing memory.
When the compiler can allow a type to be Copy, it doesn't mean that it automatically makes sense for it to be Copy. Some types intentionally need to not implement Copy.
Types which have a destructor are one example. If you could copy a vector like that, then you'd have two (or more) instances with the exact same buffer pointer, which both would be trying to free – which is wrong.
But this is just the trivial, obvious case. Some types are designed to represent unique access to a resource otherwise not connected with memory.