Some high level features of the language might be more complicated to implement in assembly than in bytecode. The latter can have instructions more closely matching the language's features.
Similarly, it is quite rare to compile programs directly to assembly. In general, you have some intermediate representations... which can closely resemble some bytecode. The reason is the same: compiling to a higher-level IR is simpler than going directly to assembly.