Você está vendo esse comportamento por causa do horário de verão (horário de verão).
Como você está no horário de verão, quando o relógio está uma hora adiantado, quando você pergunta três meses atrás, pouco depois da meia-noite de 1 de junho, o tempo acaba sendo uma hora "mais cedo" porque não horário de verão há três meses.
A documentação da data GNU sugere trabalhar em torno deste usando 12:00 e 15 do mês como pontos de partida, ao pedir dias ou meses relativos, respectivamente. Por exemplo:
date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"