Тут не сокращать, а рефакторить нужно.
1) $is_ready_to_update выносим в отдельную функцию.
2)
file_put_contents('tmp.png', file_get_contents(array_shift($valid_photos)));
Не совсем понятно, зачем создавать временный файл в 2х разных местах для отправки его на сервер? Почему сразу файл нельзя отправить?
3)
echo $offer['internal-id'] . ' updated';
echo PHP_EOL;
echo в коде очень плохо. Используйте какой-нибудь логгер для этих целей. Но если этот код консольный и его будете видеть только вы... то ну ок.
4) Создание или обновление item я бы вынес в отдельный сервис и вызывал бы метод save(), который бы у себя внутри инкапсулировал логику обновления или создание нового элемента.
5)
CATEGORIES[intval($offer->{'category-id'})]
вот это однозначно выносить в отдельную функцию, что то вида findCategoryByOffer().
6)
if ($uploaded_photos_id) {
Notice: undefined variable вам здесь может быть обеспечена.
По коду я вижу сильную завязку на API от VK и скорость работы скрипта будет зависит от скорости этого API.
Поэтому здесь нечего ускорять, а только рефакторить.