Inspired by:
Convert hex string to int in Python
I tried
In [471]: parser=argparse.ArgumentParser()
In [472]: parser.add_argument('ahex',type=lambda x: hex(int(x,0)))
In [473]: parser.parse_args(['0x21c'])  # valid hex string input
Out[473]: Namespace(ahex='0x21c')
In [474]: parser.parse_args(['21'])  # converts valid int to hex string
Out[474]: Namespace(ahex='0x15')
In [475]: parser.parse_args(['21c'])   # error if string is not valid hex
usage: ipython3 [-h] ahex
ipython3: error: argument ahex: invalid <lambda> value: '21c'
As @mgilson stressed in the comments, the type parameter is a function, one that takes a string and returns something.  It also raises an error if the string is not 'valid'.  hex() does not work as type, because it takes an integer and returns a hex string. hex('0x21c') is not valid use of that function.
For this quick-n-dirty solution I used a lambda function.  It could just as well been a def.  I used int(x,0) to convert the string to a int, in a way that handles both hex strings and integer strings.  Then I converted that integer back to a string using the hex function.
So the net effect of my lambda is to just validate the hex string.  If a valid string it just returns the same thing (same as if type was the default identity lambda x: x).
Confusion over the nature of the type parameter arises most often when people want a boolean value.  bool() does not take a string like 'True' or 'False' and return a boolean value.  Look up those SO questions if the issue is still confusing.