Am I measuring the Op-amp MCP6004 IC output voltage correctly using Arduino
The Arduino doesn't have analog outputs.  It has digital outputs with pulse width modulation that it calls &quot;analog outputs.&quot;
Your analog 0.5V signal isn't really 0.5V.
The first image shows it clearly:

You said the blue trace is the input to the MCP6004.  That blue trace is just a series of 5V pulses - if that scope is set to 2V per division.
To test your circuit, you need to filter the pulses to be a better approximation of DC.
To do that, you need a low pass filter to smooth the fast pulses into a DC signal.



simulate this circuit &ndash; Schematic created using CircuitLab
That simple low pass filter will convert the pulses to a (slightly wiggly) DC.  It has a cut off frequency of about 3Hz, so it will take a couple of seconds to &quot;zero in&quot; on the true DC result.

Attach that filter between the Arduino &quot;analog output&quot; and the MCP6004 input.
Let the circuit run for a few seconds.
Check the input to the MCP6004 with the oscilloscope - it should show a fairly stable DC instead of the pulses.  Change the &quot;analog out&quot; PWM value to correct the output voltage if you need to.
Check the output of the MCP6004 and see if it properly amplifies the input voltage.


You can't use averaging in the Arduino to get the DC value because the amplifier has to work with the peak voltage value in the pulse train.  It tries to amplify the 5V peak, but it only has a 5V supply - the pulses come out of the MCP6004 as pretty much just a distorted version of what went in.
You have to make a real DC out of the pulses.  The MCP6004 can then properly amplify that signal, and you can measure it with the Arduino.
Build the filter.  Take a look at its output, then compare that with the pulses from the Arduino.  A pulsed signal is not an analog signal, though it can be converted into one.