Already three answers and one accepted, but let me try the following code. It does allow some flexibility in the user input, but certainly will probably fail against more treacherous situations.
Update to deal with line endings... (previous version did not do the expected thing; attached image of the output updated to show now it works.)
Update so that a space after the opening brace is significant (in the previous version two or more were significant and counted as one, but a single one was ignored).
I have also illustrated the limitations of the idea. Quite probably, this is not the good way to go for this problem.
Final update: I have improved bits and pieces. See the output below.
\documentclass[a4paper]{article}
%\newcommand{\BoldAbbrv}...IMPLEMENTATION
\usepackage{iftex}
\ifXeTeX\usepackage{fontspec}\fi
\ifLuaTeX\usepackage{fontspec}\fi
\ifPDFTeX\usepackage[utf8]{inputenc}\usepackage[T1]{fontenc}\fi
\def\LongJump#1#2#3#4{#2#3#4#1}
\makeatletter
{
\obeyspaces\catcode`\^^M\active\relax%
%
\gdef\BoldAbbrv@sp{\ifx\BoldAbbrv@token\bgroup%
\ \expandafter\textbf\else%
\ifx\BoldAbbrv@token\egroup\ \else%
\expandafter\expandafter\expandafter\BoldAbbrv@aux\fi\fi}%
%
\gdef\BoldAbbrv@eol{\ifx\BoldAbbrv@token\bgroup%
\ \expandafter\textbf\else%
\ifx\BoldAbbrv@token\egroup\ \else%
\expandafter\expandafter\expandafter\BoldAbbrv@auxeol\fi\fi}%
%
\gdef\BoldAbbrv@aux#1{\ifx#1 \expandafter \else%
\ifx#1^^M\expandafter\expandafter\expandafter \else%
\ifcat\noexpand#1a{\ \bfseries#1}\else%
\LongJump{\ #1}\fi\fi\fi}%
%
\gdef\BoldAbbrv@auxeol#1{\ifx#1 \expandafter^^M\else%
\ifx#1^^M\expandafter\expandafter\expandafter\BoldAbbrv@initpar\else%
\ifcat\noexpand#1a{\ \bfseries#1}\else%
\LongJump{\ #1}\fi\fi\fi}%
%
\gdef\BoldAbbrv@inita{\def {\futurelet\BoldAbbrv@token\BoldAbbrv@sp}%
\def^^M{\futurelet\BoldAbbrv@token\BoldAbbrv@eol}}%
%
\gdef\BoldAbbrv@auxb#1{\ifx#1 \expandafter \else%
\ifx#1^^M\expandafter\expandafter\expandafter \else%
\ifcat\noexpand#1a{\bfseries#1}\else%
\LongJump{#1}\fi\fi\fi}%
%
\gdef\BoldAbbrv@nosp{\ifx\BoldAbbrv@token\bgroup%
\expandafter\textbf\else%
\ifx\BoldAbbrv@token\egroup\else%
\expandafter\expandafter\expandafter\BoldAbbrv@auxb\fi\fi}%
%
\gdef\BoldAbbrv@initb{\futurelet\BoldAbbrv@token\BoldAbbrv@nosp}%
}
%
\def\BoldAbbrv@initpar{\par\BoldAbbrv@initb}
\def\BoldAbbrv#1#{\bgroup\obeyspaces\catcode`\^^M=\active
\BoldAbbrv@inita\afterassignment\BoldAbbrv@initb\let\next= }
\makeatother
\begin{document}\thispagestyle{empty}
GNU is a recursive acronym for ``\BoldAbbrv{Gnu's Not Unix}'', chosen
because GNU's design is Unix-like, but differs from Unix by being free
software and containing no Unix code.
Space Torture test (\emph{n.b.} spaces or endlines just after
the opening brace
or just
before the closing one count as one):
GNU is a recursive acronym for ``\BoldAbbrv{Gnu's Not Unix'',
}%
\BoldAbbrv {
chosen
because GNU's design is Unix-like, but differs from Unix
by being free
software and containing }no Unix code.
This new version does not bolden quotes, unfortunately it
doesn't either bolden the letter after the quote(s): \par
\BoldAbbrv{GNU is a recursive acronym for ``Gnu's Not Unix''}.
\BoldAbbrv{Things put {inside braces} in the argument will be
typeset {entirely bold.}
Accents need to be put inside braces. Omitting
braces does \emph{not} create an error. UTF8 letters in
PDFLaTeX need to be put inside braces for the macro to
operate, but this is not necessary with XeTeX. And in both
cases no compilation errors when braces are omitted.
Examples: Gnu's Not Unix --- Gnu's Not {\"U}nix (ok) ---
Gnu's Not \"Unix (no) --- Gnu's Not {Ü}nix (ok) --- Gnu's
Not Ünix (ok with Unicode engines). As ok followed a
parenthesis it was not boldened. The parenthesis not being a
letter wasn't boldened either.}
The new version has no effect on a macro even if it expands to
a string:
\newcommand*{\GNU}{Gnu's Not Unix}\BoldAbbrv{\GNU}.
This is sad but the new version is compatible with more
general input. It only boldens letters, or groups enclosed
within braces. \BoldAbbrv{{\GNU}}.
\BoldAbbrv{The macro {can} be applied to more than
one paragraph simultaneously. Yes, really.
The macro {can} be applied to more than
one paragraph simultaneously. Yes, really.
\BoldAbbrv{And it \BoldAbbrv{can be} nested. Although one does
not see the interest.}
}
An empty argument\BoldAbbrv{} is no error.
A space after the opening brace or before the closing brace
counts: \BoldAbbrv{ Gnu's Not {\"U}nix }X. Two or more are like
just one:\BoldAbbrv{ Gnu's Not {\"U}nix }X.
This does not quite work: \BoldAbbrv{\emph{An emphasized
argument.}} And this neither: \BoldAbbrv{\itshape{}An
italicized argument,\/} where we got rid of the initial
superfluous space which is in this example:
\BoldAbbrv{\itshape An italicized argument with a spurious
initial space.} So one must do {\itshape\BoldAbbrv{This is
not argument to a macro, and it works.}\/}
\textsl{\BoldAbbrv {The macro does not work in the argument to
another macro (except itself... as it is not really a
macro with argument despite appearances!)}}
\end{document}

...for ``\textbf{G}nu's \textbf{N}ot \textbf{U}nix''is sufficient. – percusse Jan 18 '13 at 13:21\textbf Not \textbf Unix, which may be easier. Of course, thing get more complicated when the words are in lists such asNot \texttt{Unix}, i.e. lists containing typeface-changing commands. Processing lists like this programmatically may pose problems. – Jan 18 '13 at 16:02