To my S4 ignorant eyes, this appears to be an issue with the lubridate package and the way the %m+%
method is constructed.
Looking at the source,
It appears that the unexported function .quick_month_add
will do what you want
mapply(lubridate:::.quick_month_add,df,months(1:2), SIMPLIFY = FALSE)
$a
[1] "2012-01-11" "2012-06-30" "2012-04-18"
$b
[1] "2013-04-21" "2012-03-22" "2012-05-01"
note that SIMPLIFY
must be set to FALSE
otherwise you will get numeric matrix as the Date class is stripped when simplifying to a matrix.
Or, Map(lubridate:::.quick_month_add,df,months(1:2))