La consulta está fallando porque no puede modificar una tabla y seleccionar de esa misma tabla en una subconsulta.
Consulte Sintaxis de subconsultas
Creo que puedes solucionar esto con algunos trucos 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
No soy un experto en MySQL, pero creo que esto funciona porque MySQL procesa primero la subconsulta y almacena el resultado en la memoria como una tabla temporal, que no cambia durante la ACTUALIZACIÓN. Un efecto secundario de esto es que si el resultado de la subconsulta es grande, consumirá una tonelada de memoria (o se quedará sin ella).
La única forma (que yo sepa) de solucionar el problema de la memoria es reducir la subconsulta utilizando criterios que no están directamente relacionados con el objetivo de actualización. Por ejemplo, si hiciera estas actualizaciones como parte de un proceso nocturno, haga que el SELECT interno solo devuelva las filas creadas en las últimas ~24 horas.