Upto my guess, this problem can be solved by the trick that
Stop loss.backward() to compute error at each computational nodes and implement .backward() only at permitted nodes so that optimizer.step() update only permitted weights and don’t update fixed weight
But now the question is  how to customize loss.backward() or is there any other efficient and fast way?