I took the liberty of partitioning your code into functions for each formatting step.

For part 2, you simply need to edit the `$PreRead` so that it never actually sees `Null`. Here's a function that does that:

    boxExpr[body_] :=
      RowBox@{"Replace", "[", "\"thisIsJustATag\"", ";", body, ",", 
        "Null", "->", "\"\"", "]"};

The `"thisIsJustATag"` there will make more sense in a moment.

Then I pulled out the note extraction task and used `boxExpr` everywhere there was `RowBox[{body}]`. Note that I'm using the `styleNote` function I defined in my suggestion at the bottom.

    extractNotes[boxes_] := 
      Replace[boxes, {RowBox[{note1_String?(StringMatchQ[#, "\"*\""] &), 
           ";", body__, ";", 
           note2_String?(StringMatchQ[#, "\"*\""] &)}] :> ($note1 = 
           styleNote[note1, "Before"]; $note2 = 
           styleNote[note2, "After"];
          boxExpr@body), 
        RowBox[{body__, ";", 
           note_String?(StringMatchQ[#, "\"*\""] &)}] :> ($note2 = 
           styleNote[note, "After"];
          $note1 = Null;
          boxExpr@body), 
        RowBox[{note_String?(StringMatchQ[#, "\"*\""] &), ";", 
           body__}] :> ($note1 = styleNote[note, "After"];
          $note2 = Null;
          boxExpr@body),
        RowBox[{note_String?(StringMatchQ[#, "\"*\""] &), 
           ";"}] :> ($note3 = styleNote[note, "Neither"];
          $note2 = Null; $note1 = Null;
          note), e_ :> ($note1 = Null; $note2 = Null; e)}];

Next I tackled joining the two parts. Easiest to do via a two step process. First we apply the Part 1 code you supplied plus a tweak to remove the `Replace` expression we added in `boxExpr` (this is where the tag is important):

    applyFormatting[out_] :=
      With[{line = $Line},
       TraditionalForm@HoldForm[In[line] = $placeHolder] /.
          
          DownValues[In] /. {
          $placeHolder -> out,
          HoldPattern[
            Replace[CompoundExpression["thisIsJustATag", expr_], 
             Null -> ""]] :> expr
          }
        /. {
         HoldPattern[a_ = ""] :> a,
         HoldPattern[a_ = a_] :> a,
         HoldPattern[a_ = HoldForm[a_]] :> a,
         HoldPattern[(c : (a_ = b_)) = b_] :> c,
         HoldPattern[(a_ = b_) = c_] :> HoldForm[a = b = c]
         }
       ];

And then I pulled out the note formatting function and cleaned that up a little (using `Switch` is easier than `Which` here I think):

    addNotes[formatted_] :=
      Switch[{$note1, $note2, $note3},
       {Null, Null, Except@Null},
       With[{r = $note3}, $note3 = Null; r],
       {Except@Null, Except@Null, _},
       With[{r1 = $note1, r2 = $note2}, $note1 = $note2 = Null; 
        Row[{r1, Pane[formatted], r2}, Spacer[5]]
        ],
       {Except@Null, _, _},
       With[{r = $note1}, $note1 = Null;
        Row[{r, Pane[formatted]}, Spacer[5]]
        ],
       {_, Except@Null, _},
       With[{r = $note2}, $note2 = Null;
        Row[{Pane[formatted], r}, Spacer[5]]
        ],
       _,
       formatted
       ];

And then all we need is this:

    $PreRead = extractNotes;
    $PrePrint = addNotes@*applyFormatting;

to get the desired result.

###Suggestion

To make your life easier I'd suggest adding a store of text styles like:

    $outputStyles =
      <|
       "Default" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         },
       "Before" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         },
       "After" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         }
       |>;

and a styling function like:

    styleNote[note_, style_] :=
      Style[ToExpression@note, 
       Sequence @@ Lookup[$outputStyles, style, $outputStyles["Default"]]];

And then you can replace all of your note styling calls with a simple `styleNote` calls which will allow you to change how you do the styling without changing your `$PreRead` at all.

For example you can change the color for your after note text like this:

    $outputStyles["After"] = $outputStyles["After"] /. Blue -> Red

No need to edit the `$PreRead` function at all this way.

###All together

For those who don't want to copy all the pieces in, this is all the formatting code as I have it:

    $note1 = Null;
    $note2 = Null;
    $note3 = Null;
    
    $outputStyles =
      <|
       "Default" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         },
       "Before" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         },
       "After" -> {
         Blue,
         15,
         Italic,
         FontFamily -> "Times"
         }
       |>;
    
    boxExpr[body_] :=
      
      RowBox@{"Replace", "[", "\"thisIsJustATag\"", ";", body, ",", 
        "Null", "->", "\"\"", "]"};
    styleNote[note_, style_] :=
      
      Style[ToExpression@note, 
       Sequence @@ Lookup[$outputStyles, style, $outputStyles["Default"]]];
    
    extractNotes[boxes_] := 
      Replace[boxes, {RowBox[{note1_String?(StringMatchQ[#, "\"*\""] &), 
           ";", body__, ";", 
           note2_String?(StringMatchQ[#, "\"*\""] &)}] :> ($note1 = 
           styleNote[note1, "Before"]; $note2 = 
           styleNote[note2, "After"];
          boxExpr@body), 
        RowBox[{body__, ";", 
           note_String?(StringMatchQ[#, "\"*\""] &)}] :> ($note2 = 
           styleNote[note, "After"];
          $note1 = Null;
          boxExpr@body), 
        RowBox[{note_String?(StringMatchQ[#, "\"*\""] &), ";", 
           body__}] :> ($note1 = styleNote[note, "After"];
          $note2 = Null;
          boxExpr@body),
        RowBox[{note_String?(StringMatchQ[#, "\"*\""] &), 
           ";"}] :> ($note3 = styleNote[note, "Neither"];
          $note2 = Null; $note1 = Null;
          note), e_ :> ($note1 = Null; $note2 = Null; e)}];
    
    applyFormatting[out_] :=
      With[{line = $Line},
       TraditionalForm@HoldForm[In[line] = $placeHolder] /.
          
          DownValues[In] /. {
          $placeHolder -> out,
          HoldPattern[
            Replace[CompoundExpression["thisIsJustATag", expr_], 
             Null -> ""]] :> expr
          }
        /. {
         HoldPattern[a_ = ""] :> a,
         HoldPattern[a_ = a_] :> a,
         HoldPattern[a_ = HoldForm[a_]] :> a,
         HoldPattern[(c : (a_ = b_)) = b_] :> c,
         HoldPattern[(a_ = b_) = c_] :> HoldForm[a = b = c]
         }
       ];
    addNotes[formatted_] :=
      Switch[{$note1, $note2, $note3},
       {Null, Null, Except@Null},
       With[{r = $note3}, $note3 = Null; r],
       {Except@Null, Except@Null, _},
       With[{r1 = $note1, r2 = $note2}, $note1 = $note2 = Null; 
        Row[{r1, Pane[formatted], r2}, Spacer[5]]
        ],
       {Except@Null, _, _},
       With[{r = $note1}, $note1 = Null;
        Row[{r, Pane[formatted]}, Spacer[5]]
        ],
       {_, Except@Null, _},
       With[{r = $note2}, $note2 = Null;
        Row[{Pane[formatted], r}, Spacer[5]]
        ],
       _,
       formatted
       ];
    
    $PreRead = extractNotes;
    $PrePrint = addNotes@*applyFormatting;