Так логика как раз и связана с замыканием.
Есть функция, которая вызывается внутри forEach
const createCollapse = (button, i) => {
button.addEventListener('click', () => {
content[i].classList.toggle('collapse__content_open')
})
}
Она вызывается два раза. Первый раз i = 0, второй раз i = 1.
Внутри нее создается функция
() => {
content[i].classList.toggle('collapse__content_open')
}
Каждый раз создается новая функция. Они использует это i. Но каждая из них использует то i, которое было в ее лексическом окружении в момент создания этой функции. (Это и называется замыканием)
Получаются две функции. Одна (для первого дива)
() => {
content[0].classList.toggle('collapse__content_open')
}
Другая (для второго дива)
() => {
content[1].classList.toggle('collapse__content_open')
}