The key optimisation can be found in this part:
Dim orderColumnOArray as Variant, orderColumnGArray as Variant, orderColumnXArray as Variant
orderColumnOArray = ThisWorkbook.Worksheets("order").Range("O2:O1000000").Value
orderColumnGArray = ThisWorkbook.Worksheets("order").Range("G2:G1000000").Value
orderColumnXArray = ThisWorkbook.Worksheets("order").Range("X2:X1000000").Value
There above, we are using arrays to store the order data, and we can traverse them more efficiently, rather than repeat a full array formula calculation for each cell.
Note that even then we could cut down on the million rows, and do a lastRow calculation for the order sheet. Perhaps that will bring great improvement too. However if we say for now that you will genuinely have that number of data rows in the order Worksheet, we can still go about it a bit better.
'I will assume that the column needs to filled from AM3 to AMLastrow
'I also assume the tested values are strings or integers, not dates or floats
Dim resultArray() as String
ReDim resultArray(3 to Lastrow)
Dim j as Long
For i = 3 To Lastrow
resultArray(i) = "review"
For j = 1 To Ubound(orderColumnOArray)
'The below nested Ifs can be done in many different ways
'e.g. And with the 3 equality tests
'or even by initially making two concatenated arrays!
If .Range("O" & i).Value = orderColumnOArray(j, 1) Then
If .Range("G" & i).Value = orderColumnGArray(j, 1) Then
If .Range("X" & i).Value = orderColumnXArray(j, 1) Then
resultArray(i) = "pass"
'Now we can write back the array to the worksheet faster
.Range("AM3").Resize(Lastrow - 3 + 1, 1).Value = resultArray