The reason you are shooting one more bullet than expected in your code is that you first call the parent implementation of the shoot function, which shoots one bullet. Then, you shoot an extra couple of bullets using your loop. So this code will always shoot one more projectile than you would like.
My recommendation would be to create a new function dedicated to shooting several bullets in a cone (for example, shoot_in_cone()). This new function can have brand-new logic that shoots three bullets or, if you want to reuse the shoot function, you could rotate the cannon and call the shoot function three times in a loop.
2. The first bullet of the rapid fire spell has a longer cooldown
Looking at your code, the reason you observe this behavior is that you don't change the cooldown timer's wait_time until after shooting the first bullet. The shoot function starts the cooldown timer and uses the default duration of the cooldown timer set in the spell scene. It is only the next time you shoot that the value change will be taken into account.
To address this issue, move the line that changes the cooldown timer's wait time to the _ready() function, so that the cooldown timer's duration is changed before shooting the first time.
3. Changing the color of individual bullets
There are quite a few possible solutions here.
Given how the game is set up, the simplest solution here is indeed to make different bullet scenes, and you can absolutely use inherited scenes if all you want to do is tweak the color, or even change the bullet sprite for a different look. This allows you to leverage the Godot editor and preview changes without running the game.
With more experience, if you worked on a commercial game, a common solution would be to create a more complex bullet scene and script with lots of exported variables you could use to quickly change the look and effect of a given bullet. Designers in your team could then quickly create a wide variety of projectiles, and you can also modify these projectiles via code. But this approach requires a lot more code and is a bit beyond the scope of this course. I'm just mentioning it to hint at how we might do things in a more professional or team setting.