You are making heavy use of Target.Address in this situation. Target.Address only returns the cell address in this case; it does not return the sheet that the cell is on. For instance, $A$1 would be returned. No, Sheet 1! $A$1. This indicates that regardless of which sheet this address is on, your if statement checks to see whether "$A$1" Equals "$A$1." As a result, this loop will only ever execute the first sentence, making it only work in one direction.
Second, there is a tonne of duplicate code that hard-codes a lot of addresses. This can be greatly condensed, as shown below:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim cell_1, cell_2 As Range
Set cell_1 = Worksheets("Sheet1").Range("$R$3")
Set cell_2 = Worksheets("Sheet2").Range("$R$3")
Application.EnableEvents = False
If Target = cell_1 Then
cell_2.Value = cell_1.Value
ElseIf Target = cell_2 Then
cell_1.Value = cell_2.Value
Application.EnableEvents = True
This code keeps the entire cell—address, values, and everything else—in memory by using the first and second cells as a range. As you did, it then turns off EnableEvents (good effort by the way, to prevent yourself from getting stuck in an infinite loop as most people would with this kind of code). After that, it determines whether cell 1 is your target cell before switching cell 2's value to cell 1's value. No requirement for a distinct function.