That the function is consteval is not relevant. The expression in the template argument must by itself be a constant expression, which it is not because string is a reference-type function parameter (and so its lifetime didn't start with the evaluation of this constant expression) and can't be named to in a constant expression.
If it wasn't required that the expression is by itself a constant expression regardless of whether it is located in a consteval function or called as part of a constant expression, then you would be able to change the type of an expression as a function of the value passed as function argument. That is not compatible with the type system. (What would e.g. the result of decltype/std::declval on a call to such a function be?)
However, your functions don't actually try to retrieve the value or address of the object that string references at all. So it seems like that shouldn't be an issue and it doesn't have to be.
Up to C++20 there is simply a somewhat unnecessary restriction on constant expressions which disallow naming a reference which is not usable in constant expressions, even if no value or address of the referenced object is accessed. With a non-reference parameter on func1 it would work (but then built-in arrays don't support that).
The restriction will be lifted in C++23 through P2280, apparently also as a defect report against previous C++ revisions according to the poll results mentioned in the document. The paper mentions basically the same example of obtaining the size of an array. Again, consteval is not relevant to this though.
constevalfunctions have certain interactions with the parameters ofconstevalfunctions.constevalfunction inside anotherconstevalfunction doesn't require the nestedconstevalfunction call to be a constant expression by itself as well. But I don't think there is anything special if the call is part of an expression that is required to be a constant expression.