No revisé tu macro, pero supongo que el error es porque estás borrando una fila, por ejemplo borras la fila 9, entonces la fila 10 ahora es la fila 9, el for brinca al siguiente número de fila, es decir, brinca a la fila 10, pero ahora en la fila 10 tienes el dato de la fila 11, significa que el registro de la fila 10 nunca lo revisa. Es por eso que no lo borra. Haciendo el borrado de la última fila hacia la 2, no se tiene ese problema.
Otro detalle es que tienes esto "33410" si lo pones entre comillas, significa que es un texto, entonces en la celda deberá estar como texto, pero si en la celda lo tienes como número entonces no son iguales, para eso puse esto: Cells(i, 9).Text = "33410" , puse .Text para tomar el valor de la celda como texto y compararlo como texto.
Te anexo la macro con los cambios para copiar a otra hoja
Sub Borra()
Application.ScreenUpdating = False
Set h1 = Sheets("Hoja4") 'nombre de hoja origen
Set h2 = Sheets("Hoja5") 'nombre de hoja destino
fin = h1.Range("D" & Rows.Count).End(xlUp).Row
u2 = h2.Range("D" & Rows.Count).End(xlUp).Row + 1
For i = fin To 2 Step -1
If h1.Cells(i, 9).Text = "33410" And h1.Cells(i, 4).Text = "C018" Then
h1.Rows(i).Copy
h2.Rows(u2).PasteSpecial xlValues
u2 = u2 + 1
h1.Rows(i).Delete
End If
Next i
Application.ScreenUpdating = True
MsgBox "Fin"
End Sub