Скорее всего flag = 0; будет скомпилировано в## Код:
```
mov flag, 0
```
, а  System.Threading.Interlocked.Exchange - в вызов InterlockedExchange.
## Код:
```
push 0
  push flag
  call InterlockedExchange
  ...
InterlockedExchange: 
  mov     ecx, [esp+4]
  mov     eax, [esp+8]
  xchg    eax, [ecx]
  ret     8
```

Особой разницы не вижу