WARNING: There seems to be an inconsistency in your example:
a. The first (set:) macro is subtracting your $item_set collection (an Array?) from your $current value (unknown data type!). If those two variables both contained Arrays then this would result in the items within $item_set being removed from the $current value. If those two variables are of different data types then that would result in a "mismatched data type" related error.
b. The second (set:) macro is adding the current _item value (unknown data type!) to your $current value (unknown data type!). Again if the data types of those to values are NOT the same then that addition would result in a "mismatched data type" related error.
c. It seems unlikely that $current would be the same data type as both $item_set and _item.
The cause of your issue is the fact that the code withing the link's associated hook isn't executed until after the link is selected, and at the time of that execution the variables referenced by that code will either:
1. Be equal to whatever value that had at the finish of the (for:) loop. (assuming they have been changes since then).
2. No-existing, like the case of the (for:) loop's _item temporary variable.
To solve this issue you need to capture the values of the relevant variables at the time that each of those links were created, and unfortunately Harlowe doesn't have an equivalent to the <<capture>> macro you would be using if you were implementing this in SugarCube 2.
To get around this limitation you will need to use a (print:) macro to dynamically create each link from a constructed String value.
NOTE: Because of the previously mentioned inconsistency (and because you didn't give examples of the values stored within your variables) the following has been made more generic so you can see the principles required to dynamically generate a link that captures the current value of the _item temporary variable.
(set: $array to (a: "one", "two"))
(set: $variable to "")
(for: each _item, ...$array)[{
(print: "(hook: _item)+(link: _item)[" +
"(set: $variable to it + '" + _item + "')" +
"(go-to: (history:)'s last)" +
"]"
)
}]
... the above example does the following:
a. Places the (hook:) before the (link:) because the tw-hook element will be the parent of the HTML elements generated for the link. This is purely for aesthetic purposes because either way the same HTML structure is generated.
b, Uses the special it operator to indicate that the target variable ($variable or $current in your use-case) is being modified.
c. Uses singe-quotes to wrap the value of the _item variable, which converts that value into a String literal before trying to add it to the current value of $variable.