Не могли бы вы просто поставить вокруг него простой замок?Также я бы предложил переключить способ работы проверенной логики, чтобы немного упростить функцию (убрать возврат средней функции)
private static object fooLock = new object();
void foo(object sender, ItemCheckedEventArgs e)
{
lock (fooLock)
{
if (e.Item.Checked)
{
if (bar(e.Item.Index))
{
MessageBox.Show( ... )
e.Item.Checked = false;
}
}
}
}
Многочисленные способы улучшить производительность, но это должно как минимум остановить условия гонки