Hola Sergio:
Por lo que veo en la imagen, hacés tu código bastante complejo innecesariamente, y eso te ocasiona que no tengas control sobre lo que pasa.
Te dejo algunas cosas que deberías arreglar/modificar antes de seguir con el problema, y es probable que se solucione:
1) ¿por casualidad "this.parent.datos_tabla_maestro" es la misma "tabla_maestro" que aparece en varias partes del código?. Si es así deberías usar siempre la misma nomenclatura, o usás la propiedad o usás el nombre de la tabla, pero los 2 a la vez no tiene sentido. (Repito: Si es la misma tabla)
2) Si no son la misma tabla, entonces te pasa que estás intentando hacer un LOCATE del campo "tabla_maestro.cmaestro", pero estando ubicado en la tabla "this.parent.datos_tabla_maestro" que abrís justo antes, por lo que realmente el puntero de "this.parent.datos_tabla_maestro" no se mueve y por eso se queda siempre en el mismo registro. Asumo que son 2 tablas distintas porque si no el código anterior al LOCATE no tiene mucho sentido.
3) La búsqueda es un desastre: ¿En qué tabla se supone que querés buscar? porque si crees que está buscando en tabla_maestro te equivocás, está buscando en "this.parent.datos_tabla_maestro", pero con una condición que no hace referencia a esa tabla, sino a "tabla_maestro", y finalmente para rematar el error no verificás si realmente encuentra el registro y hacés directamente el reemplazo.
Si querés hacer una búsqueda y reemplazo sin problemas, tenés que tener orden:
SELECT "LaTablaDondeQuierasBuscarYReemplazar"
LOCATE FOR <CondiciónSobreEstaTablaYNoOtra> && No uses "IN tabla" porque estamos ubicados en la tabla
IF FOUND()
REPLACE importe with ..... && Nuevamente, no uses "IN tabla" porque ya estamos ubicados en la tabla
ENDIF
Saludos.-