I am a bit confused about a few of the details in your question, so here is my understanding of the goals of your question:
(1) Show the formatted reference (i.e., Reference type and number) as a note in the appropriate margin corresponding located at the line on which it is referred.
(2) Only do this for the first time a reference is made (i.e., the second \ref{fig:figure} in your MWE should not produce a note in the margin).
(3) Said note should appear in the left margin if the reference is in the first column and in the right margin if the reference is in the second.
Firstly, I'd recommend using the cleveref package and the \cref command, which provides context-aware citation (i.e., it will automatically add the "Figure" to the reference if the passed label corresponds to the figure counter.
With that, I adapted Yiannis Lazarides answer to this question which makes use of the zref package to save the x position of a label which permits the two columns to be distinguished using the multicol package. I have also added the geometry package to test the alignment of the margin notes.
To ensure that the margin note is only used on the first reference of the labelkey, \cref is redefined to check if the command \marginnote@labelkey is defined. If so, then the label has already been made into a margin note. If not, then a margin note is made and the command is defined. This also ensures that the labelkey is unique for finding the associated position with zref (the label marginnote:labelkey is used).
Here is the result:
\usepackage[left=1.5in,right=1in]{geometry}
\usepackage{cleveref}
\crefname{equation}{Equation}{Equations}
\crefname{figure}{Figure}{Figures}
\crefname{table}{Table}{Tables}
\usepackage{zref-savepos}
%Adapted from Yiannis Lazarides' answer at https://tex.stackexchange.com/a/50295/89497
\def\putmarginpar#1#2{%
\zsavepos{margnote:#1}%
\ifnum20432158>\number\zposx{margnote:#1}%
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp \relax\makebox[\dimexpr 1in+\hoffset+\oddsidemargin-\marginparsep]{\hfill #2}}%\hskip\dimexpr-\zposx{#1}sp +0.5cm \relax#2}%
\else
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp+1in+\hoffset+\oddsidemargin+\textwidth+\marginparsep\relax\makebox[\dimexpr\paperwidth-\textwidth-1in-\hoffset-\oddsidemargin-\marginparsep]{#2\hfill}}%\hskip4cm #2}%
\fi%
}
\makeatletter
%Redefine \cref so that it will make a margin note if the passed label is referenced for the first time.
\let\oldcref=\cref
\def\cref#1{%
\oldcref{#1}%
%check if the label has already been referenced.
\ifcsname marginnote@#1\endcsname
%already exists...therefore not the first citation
\else
\expandafter\gdef\csname marginnote@#1\endcsname{}%first citation
\putmarginpar{#1}{\mbox{\color{red}\oldcref{#1}}}%add note to margin
\fi
}
\makeatother
Which if added to the pramble of your MWE (and changing the \ref calls to \cref and removing showlabels):
\documentclass{article}
%\usepackage[nolabel,right]{showlabels}
\usepackage{color}
%\renewcommand{\showlabelfont}{\small\slshape\color{red}}
%\showlabels{ref}
\usepackage{lipsum}
\usepackage{multicol}
\usepackage[left=1.5in,right=1in]{geometry}
\usepackage{cleveref}
\crefname{equation}{Equation}{Equations}
\crefname{figure}{Figure}{Figures}
\crefname{table}{Table}{Tables}
\usepackage{zref-savepos}
%Adapted from Yiannis Lazarides' answer at https://tex.stackexchange.com/a/50295/89497
\def\putmarginpar#1#2{%
\zsavepos{margnote:#1}%
\ifnum20432158>\number\zposx{margnote:#1}%
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp \relax\makebox[\dimexpr 1in+\hoffset+\oddsidemargin-\marginparsep]{\hfill #2}}%\hskip\dimexpr-\zposx{#1}sp +0.5cm \relax#2}%
\else
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp+1in+\hoffset+\oddsidemargin+\textwidth+\marginparsep\relax\makebox[\dimexpr\paperwidth-\textwidth-1in-\hoffset-\oddsidemargin-\marginparsep]{#2\hfill}}%\hskip4cm #2}%
\fi%
}
\makeatletter
%Redefine \cref so that it will make a margin note if the passed label is referenced for the first time.
\let\oldcref=\cref
\def\cref#1{%
\oldcref{#1}%
%check if the label has already been referenced.
\ifcsname marginnote@#1\endcsname
%already exists...therefore not the first citation
\else
\expandafter\gdef\csname marginnote@#1\endcsname{}%first citation
\putmarginpar{#1}{\mbox{\color{red}\oldcref{#1}}}%add note to margin
\fi
}
\makeatother
\author{John Doe}
\title{Automatic marginal notes for the first use of a label}
\begin{document}
\maketitle
\begin{multicols}{2}
See \cref{fig:figure}. \lipsum[1]
A new reference to \cref{fig:figure} is not
referenced in the marginal note.
Let's do the same with an equation.
\begin{equation}
\label{eq:1}f(x) = x^2
\end{equation}
Refering to \cref{eq:1} for the first time, there should be a marginal note, as is visible here, but it shoudl begin with ``Eq.'', not ``Fig.''.
Refering to \cref{tab:1} for the first time. Here, there is no visible marginal note at all...
\end{multicols}
% lets put a table and a figure
\begin{table}
\caption{Table title}
\label{tab:1}
\begin{tabular}{cc}
x & y \\ \hline
3 & 3 \\
4 & 4 \\ \hline
\end{tabular}
\end{table}
\begin{figure}
\centering\rule{150pt}{10pt}
\caption{A figure}\label{fig:figure}
\end{figure}
\end{document}
Yields:

Edit: If you want to just use \ref in your document (as you have in your MWE), \ref can be redefined, with \cref used in the note to provide context-aware formatting. This allows for the in-text context to differ from that used in the margin notes (i.e., the abbreviated version you requested). Implemented in your MWE:
\documentclass{article}
%\usepackage[nolabel,right]{showlabels}
\usepackage{color}
%\renewcommand{\showlabelfont}{\small\slshape\color{red}}
%\showlabels{ref}
\usepackage{lipsum}
\usepackage{multicol}
\usepackage[left=1.5in,right=1in]{geometry}
\usepackage{cleveref}
\crefname{equation}{Eq.}{Eqs.}
\crefname{figure}{Fig.}{Figs.}
\crefname{table}{Tab.}{Tabs.}
\usepackage{zref-savepos}
%Adapted from Yiannis Lazarides' answer at https://tex.stackexchange.com/a/50295/89497
\def\putmarginpar#1#2{%
\zsavepos{margnote:#1}%
\ifnum20432158>\number\zposx{margnote:#1}%
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp \relax\makebox[\dimexpr 1in+\hoffset+\oddsidemargin-\marginparsep]{\hfill #2}}%\hskip\dimexpr-\zposx{#1}sp +0.5cm \relax#2}%
\else
\hbox to 0pt{\hskip\dimexpr-\zposx{margnote:#1}sp+1in+\hoffset+\oddsidemargin+\textwidth+\marginparsep\relax\makebox[\dimexpr\paperwidth-\textwidth-1in-\hoffset-\oddsidemargin-\marginparsep]{#2\hfill}}%\hskip4cm #2}%
\fi%
}
\makeatletter
%Redefine \cref so that it will make a margin note if the passed label is referenced for the first time.
\let\oldref=\ref
\def\ref#1{%
\oldref{#1}%
%check if the label has already been referenced.
\ifcsname marginnote@#1\endcsname
%already exists...therefore not the first citation
\else
\expandafter\gdef\csname marginnote@#1\endcsname{}%first citation
\putmarginpar{#1}{\mbox{\color{red}\cref{#1}}}%add note to margin
\fi
}
\makeatother
\author{John Doe}
\title{Automatic marginal notes for the first use of a label}
\begin{document}
\maketitle
\begin{multicols}{2}
See Figure~\ref{fig:figure}. \lipsum[1]
A new reference to Figure~\ref{fig:figure} is not
referenced in the marginal note.
Let's do the same with an equation.
\begin{equation}
\label{eq:1}f(x) = x^2
\end{equation}
Refering to Equation~\ref{eq:1} for the first time, there should be a marginal note, as is visible here, but it shoudl begin with ``Eq.'', not ``Fig.''.
Refering to Table~\ref{tab:1} for the first time. Here, there is no visible marginal note at all...
\end{multicols}
% lets put a table and a figure
\begin{table}
\caption{Table title}
\label{tab:1}
\begin{tabular}{cc}
x & y \\ \hline
3 & 3 \\
4 & 4 \\ \hline
\end{tabular}
\end{table}
\begin{figure}
\centering\rule{150pt}{10pt}
\caption{A figure}\label{fig:figure}
\end{figure}
\end{document}
Yields:

showlabelspackage won't really help you here, because it's focused on the reference tag, rather than the formatted version. That is in turn because it's intended to be a package used only when drafting, and that in turn is why it makes no strenuous efforts to get labels in the correct margin (yourouterproblem). In this context it prefers 'lightweight' to 'pretty'. – Norman Gray Nov 06 '15 at 10:41showlabelsis a great package very useful for debugging manuscripts. I was well aware that it would not do for my present purpose, but it was easier to illustrate my question with the labels produced fromshowlabels. I never meant to be disrespectful of your very useful package. – Denis Cousineau Nov 07 '15 at 22:11