Значит сохранение не для вашего случая.
И вряд ли такое
img: getBase64Image(images[i]),
id: images[i].id || ''
удачное решение, потому, что если вы хотите загружать сохраненное онлайн/оффлайн, то нужно проверять если ли сохраненное, и если есть, то получать сохраненное, иначе загружать по сети. А как проверять? Как раз и нужен идентификатор, то есть лучше так
images[i].id : getBase64Image(images[i]).
Но это еще не все, если на сервере изображение обновится, то клиент загрузит не новое, а сохраненное. То есть проверка по ID не решение в этом случае, нужно как-то знать еще, что изображение обновлено сервером. Если именовать изображения например как md5(временная метка), то в этом случае достаточно будет проверить свойство images[i].id, и если оно не равно сетевому имени, то загрузка и сохранение нового. Но чтобы это проверить, src изображения на странице должно быть указано, а это означает загрузка его по сети, то есть сохранение теряет смысл, если ее предварительно не блокировать.
Кроме localStorage существует и sessionStorage, и чтобы не забивать компьютер пользователя, может быть лучше использовать его. Если же серьезно рассматривать онлайн/оффлайн, то лучше
автономное приложение.