A more in-depth diagnostic scanner may give some insight.
Some things don't throw codes. I had some wiring issues with my mass air flow sensor (wire extended for supercharger) that would cause limp mode and not throw codes. So a failing MAF sensor (or maybe just dirty) may not throw codes right away but still cause problems.
Definitely get your battery tested. A low/failing battery is known to cause weird issues and not throw codes. You've had the car three years of nine .... If unsure it has been replaced and it's a BMW battery, good chance it's the original. Can get an AZ duralast or Walmart Everstart for reasonable. Batteries usually average 6 or 7 years. I got 9 out of mine. No real funky issues, just got to where I could barely start the car.