I'm changing the question because i realized what's wrong. Second condition only allow changes on Estado_validaci_n__c. The problem is that always will be other fields updated (e.g. lastModifiedDate). So there is any way to check that user is only changing that field ?
OR(
**If (Estado_reporte_trimestral__c == 'Pendiente de enviar' && Trimestre_Activo__c is different)**
AND(
ISPICKVAL(Presupuesto_de_Gestion__r.Proyecto__r.Estado_reporte_trimestral__c, 'Pendiente de enviar'),
Trimestre_Activo__c <> Presupuesto_de_Gestion__r.Proyecto__r.Trimestre_Activo__c
),
**If (Estado_reporte_trimestral__c == 'Enviado a aprobación' && Trimestre_Activo__c is equal but the field changed is not Estado_validaci_n__c)**
AND(
ISPICKVAL(Presupuesto_de_Gestion__r.Proyecto__r.Estado_reporte_trimestral__c, 'Enviado a aprobación'),
Trimestre_Activo__c = Presupuesto_de_Gestion__r.Proyecto__r.Trimestre_Activo__c,
NOT(ISCHANGED(Estado_validaci_n__c))
),
**If Trimestre_Activo__c is equal and the parent's object Estado_reporte_trimestral__c is NOT Rechazado || No válido' Or Trimestre_Activo__c is different**
AND(
OR(
AND(
Trimestre_Activo__c = Presupuesto_de_Gestion__r.Proyecto__r.Trimestre_Activo__c,
!ISPICKVAL(Presupuesto_de_Gestion__r.Proyecto__r.Estado_reporte_trimestral__c, 'Rechazado'),
!ISPICKVAL(Presupuesto_de_Gestion__r.Proyecto__r.Estado_reporte_trimestral__c, 'No válido')
),
Trimestre_Activo__c <> Presupuesto_de_Gestion__r.Proyecto__r.Trimestre_Activo__c
)
)
)