Well, it only took about four hours of redesigning and reworking my FSM's over and over but I figured it out myself in the end.
I'll leave this here in case anyone else has the same issue as there is very little information about how the Touch Object 2D Event works when storing it's Hit Point.
The object I wanted to touch is a child of my camera, it works like a GUI button detecting when the player has clicked or dragged touch input across it. For some reason the 'Store Hit Point' part of the Touch Object 2D Event was also storing the Y transform data of the camera. So it was detecting where I touched and then adding the difference in Y (which was a negative value) when the ship was moved upwards. This meant that the further upwards I moved the ship, the more the gun would aim upwards, offset from where the touch point was.
I fixed this by storing the player X and Y values as global variables in my touch controller game object (the object where I detect touch input), then in my bullet's movement FSM I would set a local Vector2 using the global player X and Y, then subtract that from my Vector2 for the touch hit point.
So yeah, tldr: subtract the player position before moving the bullet to the touch hit point.
From what I can tell, the touch object script needs the option to set it's hit point in screen space, not world space. All of the 'world to screen space' functions I tried didn't achieve this.
Extra note:
Because it's a machine gun I also had to set global variables within my touch controller FSM, then create local variables from these globals within my bullet's movement FSM. That way each bullet acts independently with it's own target based on the touch point when it was spawned.