For TypeScript specifically there is some justification in that the TypeScript compiler is rather slow, so any speed benefits of Biome would go away if it relied on TypeScript for type information.
But as a whole, not-invented-here syndrome has plagued Biome/Rome for the entire lifespan of the project. Like take a look at their error reporting code[1]. They made their own markup abstraction with their own Display trait and Write trait and a proc macro on top of it. It's cool code and probably does produce very nice error messages, but they could have easily used off the shelf crates like miette or ariadne and moved on to more important tasks.
Or even their JS parser. It's a really nice JS parser! Maybe the best in terms of error reporting and AST resolution. But they could have easily used swc and maybe shipped the actual end-user products a little faster.
[1]: https://github.com/biomejs/biome/blob/main/crates/biome_cons...