Немного упростил код и описал алгоритм подсчёта (для дат в прошлом)
function passed(d, m, g) {
//устанавливаем начальное время и сегодняшнее
var a = new Date(g, m - 1, d, 0, 0, 0, 0),b = new Date;
b.setHours(0, 0, 0, 0);
//увеличивая начальное время на 1 месяц вперёд
//подсчитываем количество полных месяцев до сегодня
//если дата превышает число дней следующего месяца
//то месяцем считаем весь следующий месяц
//5 января + 1 месяц = 5 февраля, но 31 января + 1 месяц = 28/29 февраля
for (m = 0;; m++) {
g = new Date(a.getFullYear(), a.getMonth() + 2, 0);
g.getDate() > d && g.setDate(d);
if (g > b) break;
a = g
}
d = b - a;//оставшееся время за последний неполный месяц, если будет
d = Math.round(d/864E5);//количество полных дней в этом времени
g = Math.floor(m/12);//сколько полных лет в подсчитанных месяцах
m = m % 12;//оставшиеся месяцы от полных лет
return [g, m, d]
};
alert(passed('24','8','1990'));