A consulta está falhando porque você não pode modificar uma tabela e selecionar dessa mesma tabela em uma subconsulta.
Consulte Sintaxe da subconsulta
Eu acho que você pode contornar isso com alguns truques de JOIN:
UPDATE meterreadings AS tgt
INNER JOIN (
SELECT * FROM meterreadings
WHERE meterreadingtype_id = 2
) AS src
ON tgt.meterreadingdate = src.meterreadingdate
AND tgt.location_id = src.location_id
AND tgt.created = src.created
AND tgt.asset_id = src.asset_id
SET tgt.meterreading = src.meterreading
Não sou especialista em MySQL, mas acredito que isso funcione porque o MySQL processa a subconsulta primeiro e armazena o resultado na memória como uma tabela temporária, que não muda durante o UPDATE. Um efeito colateral disso é que, se o resultado da subconsulta for grande, você consumirá uma tonelada de (ou ficará sem) memória.
A única maneira (até onde eu sei) de contornar o problema de memória é reduzir a subconsulta usando critérios que não estão diretamente relacionados ao destino da atualização. Por exemplo, se você fizer essas atualizações como parte de um processo noturno, faça com que o SELECT interno retorne apenas as linhas criadas nas últimas 24 horas.