Does this Foo machine halt?
C# (Visual C# Interactive Compiler), 71 bytes



x=&gt;{for(int i=0,k=0,f=x.Count;i++&lt;1&lt;&lt;f;k%=f)k-=(x[k]*=-1)%f-f;i/=x[k];}


Try it online!

I don't know if the following is valid, since it requires a custom delegate with a signature of unsafe delegate System.Action&lt;int&gt; D(int* a);
 and has to be wrapped in an unsafe block to be used, but here it is anyways:

C# (.NET Core), 64 bytes



x=&gt;f=&gt;{for(int i=0,k=0;i++&lt;1&lt;&lt;f;k%=f)k-=(x[k]*=-1)%f-f;k/=x[k];}


Try it online!

This function takes in an int* and returns a Action; in other words, it is a curried function. The only reason I use pointers is because of codegolf.meta.stackexchange.com/a/13262/84206, which allows me to save bytes by already having a variable already defined with the length of the array.

Saved 9 bytes thanks to @someone