I have looked into the generated HLSL code of the material.
It seems the redefinition error occurs because I have connected one custom node output to material position offset and another output to material normal.
It creates the same functions with different names from the custom node.
So material blueprint does not repeatedly run custom node as the number of outputs, it just creates the same content functions with different names and use them for different purposes.
GetMaterialCustomizedUVs function,
and GetMaterialPreviousWorldPositionOffsetRaw function in the generated HLSL code uses the same but different name function twice but with different inputs.
There are some other in the HLSL code that uses the custom node function just once.
So I think there is no unnecessary repeated execution of the custom node code as the number of output increases.
However as I have coupled Normal and Position offset via the custom node, the generated material HLSL code may run the whole function when it only needs to calculate normal or when it only needs to calculate position offset.
So I think it is better to avoid directly connecting material output with the custom node output.
It seems you should try to avoid a custom node being shared by multiple material output paths.