The code you give that produces constant re-evaluation by the front-end can be further reduced to

But on my system (I'n running V12.1 on MacOS 10.13.4), there is no freeze. The cell bracket is only saying the cell is busy. Other evaluations can be made while the Manipulate output cell is in the busy state. The evaluation can be stopped by simply deleting the output cell.
The same is true for the code in you post. In fact, I can get both my reduced version and your posted version to run at the same time and still do other computations.
The problem, if it is to be considered a problem, arises because Manipulate expressions are rewritten when they are evaluated and all free variables in the expression become local variables of a DynamicModule that gets wrapped around the Manipulate code. By default, such variables are automatically tracked by the front-end while the Manipulate is running. Hence, the busyness.
In a comment to your questions, kglr describes the standard practice for reducing the busyness.
Manipulate[ Table[u = a; u, {a, {1, 2, 3}}], {i, None}, TrackedSymbols :> {}]
Here are two more:
Manipulate[ Table[Block[{u}, u = a; u], {a, {1, 2, 3}}], {i, None}] Manipulate[ Once @ Table[u = a; u, {a, {1, 2, 3}}], {i, None}]
The 1st works by localizing u in the Table expression, so it doesn't get put into the list of dynamic variables of the DynamicModule wrapper. The 2nd works by telling Mathematica to evaluate the table just once and remember the result.
TrackedSymbols :> {i}? $\endgroup$TrackedSymbols :> {i}, it remove the stuck. But I don't understand what is going on. Why we must needTrackedSymbols :> {i}? $\endgroup$