I think I understand what you're trying to do, the order of this might be wrong (if so just switch the position of f1 and f2 on the 4th line).
Expression<Func<string, string>> f1 = (s) => "hello" + s;
Expression<Func<string, string>> f2 = (s) => s + s;
var parameter = Expression.Parameter(typeof(string), "p1");
Expression<Func<string, string>> ffinal = Expression.Lambda<Func<string, string>>(Expression.Invoke(f1, Expression.Invoke(f2, parameter)), parameter);
Console.WriteLine(ffinal.ToString());
Console.WriteLine(ffinal.Compile()("123"));
when calling ffinal it takes to string passed in, calls f2 and the result of that gets passed into f1, so the printed string is hello123123
also of interest logging the expression to string gives you this
p1 => Invoke(s => ("hello" + s), Invoke(s => (s + s), p1))