The difference in implementation between a FLL and PLL is completely dictated by what device is used as the error detector: if the error detector produces an error that is directly proportional to phase (phase detector) that is then passed into the loop filter, then the implementation will be a PLL and we would treat the VCO (Or NCO) as a phase integrator (since that device producing a frequency in proportion to its input, so produces a phase in proportion to the integral of the input). If the error detector is directly proportional to frequency (such as a frequency discriminator) that is then passed into the loop filter, then that device would be an FLL and we would treat the VCO or NCO as a proportional device producing a frequency in direct proportion to its input. Note that we can have a phase detector that we then take the derivative of its output which would then be a frequency discriminator (and this approach can be used for a combined FLL/PLL) so the actual block diagram and functionality needs to be carefully reviewed for each case.
Frequency is simply the derivative of phase with respect to time. So in a phase estimation algorithm you estimate absolute phase (relative to a reference which is typically the phase of a symbol location on the complex IQ plane), while in a frequency estimation algorithm you estimate the rate of change of phase with respect to frequency which is independent of any offset.
Picture a wheel that is spinning at a constant frequency and we use a control loop to stop the spin; if we measure error using a frequency estimation algorithm to then reverse and ultimately stop the spin, it will eventually stop but at an arbitrary offset like we would typically expect from a roulette wheel. If we use a phase estimation algorithm to measure error which is then used to stop the spin (and assuming we can keep up with and overcome the rate of change which implies sufficient loop order) it will stop at the exact place you desire (and you’ll be a winner every time!)