std::move не снимает const: здесь результат имеет тип const Item&&. Его нельзя передать конструктору Item(Item&&), зато конструктор Item(const Item&) подходит. Поэтому создаётся копия. Сам std::move не выполняет перемещение.
Если ключ отсутствует, operator[] вставляет новый элемент. Для int со стандартным аллокатором значение инициализируется нулём. Поэтому value равен 0, а в map теперь один элемент. Для поиска без вставки можно использовать find; at для отсутствующего ключа выбросил бы исключение.
Захваченный по значению n хранится внутри объекта лямбды. При копировании next создаётся другой объект со своим n, пока равным нулю. mutable разрешает менять этот внутренний счётчик, но не объединяет состояние копий.
Виртуальный вызов выбирает реализацию Derived::show. Но аргумент по умолчанию берётся из объявления, доступного через статический тип ref — Base&. Поэтому вызывается Derived::show(1).
snapshot — отдельное значение bool. А auto выводит для proxy тип std::vector<bool>::reference: это объект-посредник, связанный с битом вектора. После изменения flags[0] преобразование proxy в bool даёт true. Вектор не менял размер, поэтому proxy остаётся действительным.