Passing a variable in OPENJSON WITH statement in SQL Server
It looks like there were two issues with your dynamic SQL approach:

You didn't properly escape the single quotes in the @Param variable
You can't access a table variable inside the scope of a dynamic SQL statement

For details on this, and workarounds, see Erik Darling's article Starting SQL: Dynamic SQL And Temporary Objects



With those things addressed, here's a slimmed down version of the code that demonstrates how the dynamic SQL can work, using a temporary table instead of a table variable.
CREATE TABLE #json
(
    Json_Table nvarchar(max)
);

DECLARE @Param varchar(1000),
        @Symbol char(3),
        @Sql nvarchar(max);

SET @Symbol ='GBP';
SET @Param = '$.rates.' + @Symbol;
SET @Sql = N'
SELECT  *
FROM OPENJSON((SELECT Json_Table FROM #json), N''$'')
WITH 
(
    SampleValue nvarchar(max) ''' + @Param + ''',
    SampleDate date ''$.date''
);
';

INSERT INTO #json 
    (Json_Table)
SELECT 
    N'{&quot;base&quot;:&quot;USD&quot;,&quot;rates&quot;:{&quot;GBP&quot;:0.7739357155},&quot;date&quot;:&quot;2020-10-15&quot;}';

EXEC sys.sp_executesql @SQL;


See an interactive example of this at the db&lt;&gt;fiddle link.