Problem arrises because your enable events condition is in the wrong place and you have not reset it to true.

I dont know why you would want to use protect in this routine

Try this

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 4 Then Exit Sub 'only works in Columns D
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Cells(4, 4)) Is Nothing Then Exit Sub
         
    Application.EnableEvents = False
                
    'ActiveSheet.Protect Password:="test", userinterfaceonly:=True
    Cells.Columns.Hidden = False
    Select Case Cells(4, 4).Value
    Case "CM", “LR”, “MG”, “NR”
       Columns("U:AI").Hidden = True
       Columns("AP:BJ").Hidden = True
       Columns("BQ:CQ").Hidden = True
    End Select
    Select Case Cells(4, 17).Value
    Case "Excessive time charges"
       Columns("AM:BP").Hidden = True
    Case "Failure to produce documentation"
       Columns("AJ:AL").Hidden = True
       Columns("BK:BP").Hidden = True
    Case "Not an eligible benefit"
       Columns("AJ:AO").Hidden = True
       Columns("BN:BP").Hidden = True
    Case "Overcharged"
       Columns("AJ:BM").Hidden = True
    Case Else
        Columns("U:CQ").Hidden = True
    End Select
    Application.EnableEvents = True
End Sub