Это хороший вопрос. Я поясню.
TListBox может иметь большое число элементов (Items, например 1000). Однако, реально из них отображается только видимая часть (Например 50). Отсюда приходит мысль, что не следует грузить стиль всем элементам в лист боксе, поскольку это займет очень много ресурсов: как процессорного времени на загрузку, так и памяти на хранение.
При прокручивании TListBox, стили выгружаются с невидимых элементов, и загружаются для новых видимых.
Каждый элемент TListBoxItem, хранит свои данные у себя (Text, IsChecked, Bitmap).
Когда стиль загружается, сам элемент TListBoxItem, устанавливает нужные данные в объекты стиля в соответствии с хранимыми данными (Text, IsChecked, Bitmap).
При выгрузке стиля установленные данные в объекты стиля, теряются. Если только они не были самостоятельно сохранены.
Когда вы вручную самостоятельно добавляете свой объект в стиле, вы должны позаботиться о том, чтобы сохранить задаваемые данные для элементов и восстановить эти значения при очередной загрузке стиля.
TStyledControl поддерживает встроенный механизм кэширования пользовательских данных через StylesData.
При использовании StylesData контрол автоматически сохраняет ваше значение в своем словаре и при смене стиля самостоятельно обновляет свойства объектов стиля в соответствии с хранимыми данными в словаре.
О том, как работать с StylesData можно прочитать тут: Доступ к элементам стиля StylesData
Когда вы стали использовать вариант с icon, то по сути сам TListBoxItem за вас восстановил иконку, поскольку это заложено в его базовое поведение
P.S. Используйте StylesData.