Não entendi muito bem porque é necessario que o array seja construido sobre um select "as struct", se poderia ser apenas um array, embora no exemplo abaixo não seja possivel compilar sem essa opção:
SELECT
id_produto,
preco,
id_materia,
ARRAY(
SELECT -- se remover o AS STRUCT da erro
mp,
ROW_NUMBER() OVER() AS idx
FROM
UNNEST(materiasprimas) AS mp
) AS materiaprima_index
FROM
`curso-bigquery-436611.beleza_verde_vendas.produtos`;