То, что вы написали нужно только, если у вас выполняется несколько функций одновременно, которые обновляют стейт и зависят от текущего стейта, т.е. чтобы получить новое состояние до перерендера компонента, иначе вы получите неверное значение стейта, т.к. setState выполняется асинхронно. Здесь же при нажатии кнопки remove одновременно выполняется функция обновляющая стейт только один раз, поэтому смысла никакого в такой "оптимизации" нет, тем более в обработчиках событий, таких как click, пакетное обновление и сейчас работает по-умолчанию. И, кстати, то, что вы называете колбэком, на самом деле тотже первый аргумент в setState, только функция, а не объект, callback же идет вторым аргументом.
Кстати, с 17 версии реакта (по словам Абрамова) будет пакетное обновление стейта по дефолту вообще везде, а не только в обработчиках событий.