You might be able to get what you want as described here by disabling clipping and changing the margins:
p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
p + annotate("text", x = 5, y = 25,
label = "Some looooooooooooooooooooooooooong text") +
coord_cartesian(clip = 'off') +
theme(plot.margin = unit(c(1,5,1,1), "lines"))
With that approach you still have to compute the size of margin needed depending on the text length and position, for example:
lbl_txt <- "Some looooooooooooooooooooooooooong text"
p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
p + annotate("text", x = 5, y = 25,
label = lbl_txt) +
coord_cartesian(clip = 'off') +
theme(plot.margin = unit(c(1,(nchar(lbl_txt)-5)*2,1,1), "points"))