To explain the lifetime issue: It’s an ownership issue! The variable strings of type Vec<&str> contains borrowed strings. Initially, the string literals "aaa", "bb", "cc" borrow from static program data, so they don’t need a visible owner. But once you start concatenating, there are new string values generated at run-time.
New string values (e.g. as opposed to borrows or slices of existing strings) require some memory to be written into, and some owner for that memory. string.to_owned() allocates this memory, and the + "meteor" modifies it, but the strings variable of type Vec<&str> is unable to own any string data! Hence, the borrow &(string.to_owned() + "meteor") borrows data owned by nobody – beyond the implicit temporary variable that will own it for the duration of that statement – which leads to a borrow-checking error when you try to keep this borrow alive for too long.
@vague already proposed approaches for creating a new vector, one that can own its string data, of type Vec<String>. If you want to modify an existing vector instead, you would need to start out with a Vec<String>, e.g. let mut strings= vec!["aaa".to_owned(), "bb".to_owned(), "cc".to_owned()];, then you can use e.g. *string += "meteor" in a loop without problem.