В этом случае переменная buttons создает ссылку на дочерний элемент отсоединенного элемента и не позволяет элементу собирать мусор, по крайней мере до тех пор, пока кнопки не выйдут из области видимости.
РЕДАКТИРОВАТЬ:
Для того, чтобы что-то было собрано мусором, его нужно отсоединить от DOM, и не должно быть никаких переменных JavaScript, ссылающихся на элемент (или любые элементы в дереве отделенных узлов)
Например:
<div id="a">
<div id="b">
<div id="c">
<div id="d"></div>
</div>
</div>
</div>
Если вы хотите отсоединить "#b" и собрать мусор, у вас не может быть переменных, указывающих на элементы b, c или d.
Это не будет работать:
var c = $('#c')
$('#b').detach()
var c будет хранить ссылку на элемент #c, который является частью #b, поэтому быть не может быть сборщиком мусора.
Этотоже не работает, потому что detach возвращает ссылку на элемент, который вы отсоединяете.
var b = $('#b').detach()