I teach Scratch at the MADE (video game museum in Oakland) and I've run into the following:
- Mutual sprite collision (think a projectile hitting another sprite, and wanting it to both disappear and do damage to the thing that got hit) can easily have race conditions unless you take special care to avoid them
- Scrolling games are hard to do for a number of reasons (backgrounds don't natively scroll, sprites have fairly hard size limits and can't be fully moved off the edge of the stage)
- As others have mentioned, the inability to share code between sprites outside of clones is a bummer
- The heuristic for waiting for the next frame in a loop works well for simple stuff, but gets in the way for more complicated things. You can work around this by defining your own block and enabling the "run without screen refresh" option, but if you accidentally create an infinite loop in that block, the entire UI becomes unresponsive (at least in Scratch 2, perhaps they've fixed that in Scratch 3)