var d = new Date();
d.setMonth(d.getMonth() - 3);
Esto funciona para enero. Ejecute este fragmento:
var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
Hay algunas advertencias ...
Un mes es algo curioso. ¿Cómo se define 1 mes? ¿30 dias? La mayoría de la gente dirá que hace un mes significa el mismo día del mes en la cita del mes anterior necesaria . Pero más de la mitad del tiempo, es decir, hace 31 días, no 30. Y si hoy es el 31 del mes (y no es agosto o diciembre), ese día del mes no existe en el mes anterior.
Curiosamente, Google acepta JavaScript si le pregunta qué día es un mes antes de otro día :

También dice que un mes dura 30.4167 días :

Entonces, ¿es un mes antes del 31 de marzo el mismo día que un mes antes del 28 de marzo, 3 días antes? Todo esto depende de lo que quiere decir con "un mes antes". Ve a conversar con el propietario de tu producto.
Si desea hacer lo que hace momentjs y corregir estos errores del último día del mes moviéndose al último día del mes, puede hacer algo como esto:
const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());
Si sus requisitos son más complicados que eso, use algunas matemáticas y escriba un código. Eres un desarrollador! ¡No tienes que instalar una biblioteca! ¡No tiene que copiar y pegar desde stackoverflow! ¡Puede desarrollar el código usted mismo para hacer exactamente lo que necesita!