You could make your option list to be just ["y", "n"] and force the input (which does not need the str(), because input() will return a string object by default) to lower case:
The conditional expression in the above if statement gets evaluated as (p_choice == option[0]) or (option[1])
The first part of the expression gets evaluated to False when p_choice is either ‘n’ or ‘N’.
But the second part of the expression which appears after ‘or’ gets always evaluated to True as in Python any variable with value other the 0s, false, empty sequences, empty mappings will gets evaluated as True.
So over all the result of expression in the if statement is always ‘True’. Due to this you get the value printed as ‘answer 1’.
One obvious fix would be to rewrite the if statement as
if p_choice == option[0] or p_choice == option[1]:
Besides that you can also simplify the overall function by rewriting it as below:
def roll_again(player_hold: str):
option = ["y", "n"]
while True:
p_choice = str(input(f"Roll again, {player_hold}? (Y/N) "))
if p_choice.lower() in option:
if p_choice.lower() == option[0]:
print("answer:1")
else:
print("answer:2")
else:
print(f"""I don't understand: \"{p_choice}\". 'Please enter either "Y" or "N".\n""")
continue