Дело в том, что
[NSImage imageNamed]
Как вы упомянули, он находится в кеше, и, пока он находится в кеше, он будет возвращать кэшированное изображение, поэтому вам нужно сначала освободить предыдущую ссылку или использовать метод setName объекта и значение nil. Вот ссылка на документацию:
Класс NSImage может кэшировать ссылку на возвращенный объект изображения для производительности в некоторых случаях. Тем не менее, класс удерживает кэшированные объекты только тогда, когда объект существует. Если объект изображения впоследствии освобождается, либо из-за того, что его счетчик хранения был равен 0, либо на него не ссылались нигде в приложении для сбора мусора, объект может быть незаметно удален из кэша. Таким образом, если вы планируете удерживать возвращенный объект изображения, вы должны сохранить его так же, как любой объект Какао. Вы можете явно удалить объект изображения из кэша, вызвав setName: метод объекта и передав nil для имени изображения.