Well no, it won't.
Think about it: a serial port connects two machines by a single piece of wire. So only one thing at a time can talk to the machine at the other end, or the remote machine will just get confused because it can be receiving data from two pieces of software at the same time - and it can't tell where they came from because characters don't have a "tag" which says "I came from software A" or "I came from software B". It's a bit like standing in the kitchen while your wife and child both try to tell you what to do at the same time: you can't listen to both of them at the same time!
Add to that the way you are "opening a new form" and things start to get very confused.
Application.Run is not intended for opening new forms: it opens a new application, separate form the existing one, and the code will not return until the new app is finished.
So what you want to do is have one single SerialPort for your application, and have it route the data to the appropriate form.
So Form1 opens and connects the serial port. It receives the "M", writes the "A" and opens a new Form 2:
if (bytes == 'M')
{
serialPort1.Write("A");
Form2 f2 = new Form2();
f2.Show();
do
{
bytes = serialPort1.ReadByte();
f2.ProcessByte(bytes);
} while (bytes != "X");
f2.Close();
May not be exactly what you want, but it stands a chance of working!