Few things to consider...
O2 sensor placement.
needs to be as close as possible to engine. Too far away they can become inaccurate.
Must have Zero exhaust leaks!
Even a tiny leak can drastically change reading(s).
Say you have a small leak, o2 reads lean, ecm dumps more fuel to combat inaccurate reading and engine runs too rich.
Is it going closed loop and staying there?
Coolant temp sensor.
Verify it is seeing actual engine temp, and display matches.
An ecm that sees low coolant temps with drastically increase afr.
If sensor is off they will run too rich.
Verify fuel pressure is correct. Too high and injectors dump too much fuel compared to what ecm is expecting.
With efi there is the huge lie/myth of self tuning systems. They ALL need tuning.
Their stock programming is generally too rich for real world imho.
Changing stock values via handheld unit = tuning.
EFI isn't a magic bullet, everything has to be correct just like any carb'd engine.
Spark, good voltage to electronics, etc.
Plugs look rich, but when did you pull them?
Best is to do a normal-ish long drive then pull them.