В f-строках выражения анализируются с эквивалентом:
ast.parse('(' + expression + ')', '<fstring>', 'eval')
см. https://docs.python.org/3/library/ast.html#ast.parse
Но переменные будут заменены их фактическим значением. То, что вы ищете, это своего рода вложенная оценка, которая не поддерживается f-строками. Вместо этого, в качестве безопасного подхода, вы можете сначала разделить с помощью «**», затем преобразовать в int и, наконец, использовать power:
In [9]: s = "2**4"
In [10]: print(f"{pow(*map(int, s.split('**')))}")
16