If you add a message box to display R before 'Loop While' you can see the problem. The value of R is never reset.
You can set it as you have done at the start of the loop or provide an additional option in the IF statement e.g. as follows (the code does not indicate what EntityDesc(Entity) relates to so the example omits it).
Sub Macro1()
Dim InputIRN As String
Dim R As Long
Do
'InputIRN = InputBox(Title:="New " & EntityDesc(Entity) & " Email", _
Prompt:="Enter IRN(s):" & vbNewLine & vbNewLine & _
"Note: Separate multiple IRNs with a semi-colon or a comma.", _
Default:=InputIRN)
InputIRN = InputBox(Title:="New Email", _
Prompt:="Enter IRN(s):" & vbNewLine & vbNewLine & _
"Note: Separate multiple IRNs with a semi-colon or a comma.", _
Default:=InputIRN)
If StrPtr(InputIRN) = 0 Then
R = vbCancel
Else
If ((InputIRN = "") Or (InputIRN = "False") Or (InputIRN = vbNullString)) Then
R = MsgBox("You did not enter an IRN.", vbRetryCancel + vbInformation, "Missing IRN")
ElseIf InStr(1, InputIRN, "#") Then
R = MsgBox("# characters cannot be used in IRNs.", vbRetryCancel + vbInformation, "Invalid characters")
Else
R = 1 'vbOK
End If
End If
MsgBox R
If R = vbCancel Then Exit Sub
Loop While R = vbRetry
MsgBox InputIRN
End Sub