What's lexer.next() returning? If it's a String, then the answer is to just stop turning it into a &String and you can stop cloning it. (And it it's returning a &str of some sort, then you don't need the & in &lexer.next().)
Assuming the lexer returns owned strings (i.e. lexer.next() -> Option<String>), if you just drop the & in &lexer.next(), token will have type String in the loop in parse_until, and then you can just push it into the vector and return a Vec<String>, which solves the first clone. For the second one, you should use constants.into_iter() instead of constants.iter(), and then it will consume the strings instead of simply getting a reference, so you will be able to just do Expr::Constant(constant) instead of cloning.
There is also a way to solve this where you use references everywhere, making the types Expr<'a> and Lexer<'a> borrowing from some backing store, and then you don't have to do any copies. But this is trickier and more verbose (and may not be applicable depending on where the lexer is getting its data from).
Thank you very much! Lexer is opening files and reading them, so I guess it makes sense for it to own the Strings, as the caller only passes a Path when constructing it.