The above behaviour was observed on Tensorflow version 2.5.0. I just tested my exact same code on Tensorflow version 2.3.0 and get the desired behaviour (user passed in initial state in the call method over-rides get_initial_state() of the custom RNN cell whether Stateful is True or False), which seems to be consistent with the documentation:

A get_initial_state(inputs=None, batch_size=None, dtype=None) method that creates a tensor meant to be fed to call() as the initial state, if the user didn’t specify any initial state via other means.

However, in Tensorflow 2.3.0, if Stateful = True, it is ignoring the get_initial_state() method even if a user initial_state is not passed in (leading to initializing initial state as all zeroes).