First I would recommend to polish you logic and prone it via just SELECT statement to make sure that your code works before you will apply the UPDATE statement
So, the proper SELECT would be as below
SELECT * REPLACE(
ARRAY(
SELECT AS STRUCT * REPLACE(
(SELECT AS STRUCT *
REPLACE(REGEXP_REPLACE(pagePath, r'.*string_selected=([^\&]+)','New Value') AS pagePath)
FROM UNNEST([page])
) AS page)
FROM UNNEST(hits)
) AS hits)
FROM `project.dataset.ga_sessions_20180101`
WHERE CAST(visitID AS STRING) = "1234"
above leaves the whole schema untouched with exception of ONLY one field - pagePath!
Now, after you have your logic polished - you can proceed with UPDATE as below
UPDATE `project.dataset.ga_sessions_20180101`
SET hits = ARRAY(
SELECT AS STRUCT * REPLACE(
(SELECT AS STRUCT *
REPLACE(REGEXP_REPLACE(pagePath, r'.*string_selected=([^\&]+)','New Value') AS pagePath)
FROM UNNEST([page])
) AS page)
FROM UNNEST(hits)
)
WHERE CAST(visitID AS STRING) = "1234"
Assuming regexp and where clause is correct in your original question (as I have not changed it at all) and does what you want - above is what you asked for!