Ok, something to try:
\define removeme() [[$(item2)$]]
\define empty()
<$vars appendme="[[$(item2)$]]">
<$button class="tc-btn-invisible">
<$action-listops $tiddler='$(tiddler)$' $field="$(field)$"
$subfilter="+[append<appendme>]"/>
{{$:/image/checkbox1}} <<label>>
</$button>
<$vars>
\end
\define toggle-in-field(tiddler, field, item, item2, label)
<$set name=item2 value='$item2$' emptyValue='$item$'>
<$set name=label value='$label$' emptyValue='[[$item$]]'>
<$vars tiddler="""$tiddler$""" field="""$field$""">
<div style="white-space:nowrap; display:inline-block; margin-right:3px;">
<$list filter="[enlist{$tiddler$!!$field$}regexp[^$item$$]limit[1]]" variable=n1 emptyMessage=<<empty>>>
<$button class="tc-btn-invisible" >
<$action-listops $tiddler='$tiddler$' $field="$field$"
$subfilter="+[remove<removeme>]"/>
{{$:/image/checkbox2}} <<label>>
</$button>
</$list>
</div>
</$vars>
</$set>
</$set>
\end
It seems to work with your Foo bar examples, but my testing was pretty brief. It does NOT use variable #2, because I don't understand yet what you want to do with that. Perhaps you could explain in more detail.
There was some TW-Logic errors (TW-Logic is not to be confused with the real thing). This line presents problems:
<$set name=item2 value='$item2$' emptyValue='[[$item$]]'>
Because if there is a value then the rest of the code sees a simple text string, but if there is not a value than the rest of the code sees a title list string. The rest of the code needs it to be one or the other. I switched it off, but then switched on title list right before the list-ops. This might not be the best way, but it seems to work.
There's only one list widget now. There was a logic error with !regexp. !regexp returns a list of items that don't match the criteria, but that doesn't mean that aren't other criteria that DO match the criteria. So instead I used the "emptyMessage" for when there were no items that matched. This meant playing with variable names a bit.
HTH
-- Mark