Since the whole outer cell, which contains \specialcell should be bold, \bfseries can be specified in the outer cell, right before \specialcell:
... & \bfseries\specialcell{...} & ...
This can also be put into a macro \specialcellbold, see the following example:
\documentclass{report}
\usepackage{booktabs}
\usepackage{array}
\newcommand*\rotbf[1]{\rotatebox{90}{\textbf{#1}}}
\newcommand{\specialcell}[2][c]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
\newcommand{\specialcellbold}[2][c]{%
\bfseries
\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}%
}
\begin{document}
\begin{table}[hbr]
\centering
\label{tbl:heatwheel_res}
\begin{tabular}{llll}
\toprule
\textbf{Parameter} &
\specialcellbold{Exhaust\\air} &
\specialcellbold{Exhaust and\\ outdoor air} &
\specialcellbold{Heat wheel\\(80~\%)} \\
\midrule
Heat recovery [\%] & 89,6 \% & 89,6 \% & 77,4 \% \\
Real heat recovery [\%] & 50,5 \% & 52,1 \% & - \\
Net energy need for VH and SH & 27,7 & 27,0 & 15,8 \\
\specialcell{Delivered energy for\\DHW, VH and SH} & 31,1 & 27,6 & 45,6 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}

The table formatted a little different:
\documentclass{report}
\usepackage{booktabs}
% \usepackage{array}% It can also be loaded explicitly, implicitly it is
% loaded by siunitx
\usepackage{siunitx}
% \sisetup{output-decimal-marker={,}}% OP now wants to have the default dot
\sisetup{detect-weight, mode=text}
\newcommand*\rotbf[1]{\rotatebox{90}{\textbf{#1}}}
\newcommand{\specialcell}[2][b]{\begin{tabular}[#1]{@{}c@{}}#2\end{tabular}}
\newcommand{\specialcellbold}[2][b]{%
\bfseries
\sisetup{text-rm=\bfseries}%
\begin{tabular}[#1]{@{}c@{}}#2\end{tabular}%
}
\newcommand*{\leftspecialcell}[2][b]{%
\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}%
}
\begin{document}
\begin{table}[hbr]
\centering
\label{tbl:heatwheel_res}
\begin{tabular}{l*{3}{S[table-format=2.1]}}
\toprule
\textbf{Parameter} &
{\specialcellbold{Exhaust\\air}} &
{\specialcellbold{Exhaust and\\ outdoor air}} &
{\specialcellbold{Heat wheel\\(\SI{80}{\percent})}} \\
\midrule
Heat recovery [\si{\percent}] & 89,6 & 89,6 & 77,4 \\
Real heat recovery [\si{\percent}] & 50,5 & 52,1 & {---} \\
Net energy need for VH and SH & 27,7 & 27,0 & 15,8 \\
\leftspecialcell{Delivered energy for\\
\quad DHW, VH and SH} & 31,1 & 27,6 & 45,6 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}

Remarks:
- Bottom aligned header row.
- Columns 2 to 4 are centered.
- Use of package
siunitx for aligning at the decimal marker and for setting the percent signs.
- The lines after the first line in a left cell is indented.
and the alignment follows the bottom line instead of vertical
centering.
- Use of em dash instead of the hyphen for the missing entry.
- Redundant percent signs removed.
- Changed the output decimal marker to the default dot (see comment of ROLF).
- A little crude is
\siunit{text-rm=\bfseries}. Option detect-weight did not work inside an S-column.
Update
I, Svend Tveskæg, found the code not very easy to read to I cleaned it up a bit (I hope it's okay):
\documentclass{report}
\usepackage{booktabs}
\usepackage{siunitx}
\sisetup{
% output-decimal-marker = {,},
detect-weight,
mode = text
}
\newcommand*{\specialcell}[2][b]{%
\begin{tabular}[#1]{@{}c@{}}#2\end{tabular}%
}
\newcommand*{\specialcellbold}[2][b]{%
\bfseries
\sisetup{text-rm = \bfseries}%
\begin{tabular}[#1]{@{}c@{}}#2\end{tabular}%
}
\newcommand*{\leftspecialcell}[2][b]{%
\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}%
}
\begin{document}
\begin{table}[htbp]
\centering
\label{tbl:heatwheel-res}
\begin{tabular}{l *{3}{S[table-format = 2.1]}}
\toprule
\textbf{Parameter} &
{\specialcellbold{Exhaust \\ air}} &
{\specialcellbold{Exhaust and\\ outdoor air}} &
{\specialcellbold{Heat wheel \\ (\SI{80}{\percent})}} \\
\midrule
Heat recovery [\si{\percent}] & 89,6 & 89,6 & 77,4 \\
Real heat recovery [\si{\percent}] & 50,5 & 52,1 & {---} \\
Net energy need for VH and SH & 27,7 & 27,0 & 15,8 \\
\leftspecialcell{Delivered energy for \\
\quad DHW, VH and SH} & 31,1 & 27,6 & 45,6 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
\bfseries\specialcell. – Heiko Oberdiek Dec 13 '14 at 21:23\specialcellin the last row should not be bold, but use the same font as the other entries in the first column below the header row. – Heiko Oberdiek Dec 13 '14 at 23:24siunitx(a dot) or the explicit\sisetup{output-decimal-marker={.}. – Heiko Oberdiek Dec 14 '14 at 11:30siunitxpackage, you should use\si{\percent}instead of\%(in three places). Also, maybe use an em dash instead of an en dash for the empty entry. – Svend Tveskæg Dec 14 '14 at 15:10\mbox{--}you can just use{--}, becausesiunitxwill understand from the brace that a non numeric entry has been given and will center the item. Similarly for\mbox{\specialcell{...}that can just be{\specialcell{...}}. It's faster, because no expansion to find an unexpandable token is required. – egreg Dec 14 '14 at 15:15S[table-format=2.1]S[table-format=2.1]S[table-format=2.1]by*{3}{S[table-format=2.1]}and there's no point in\usepackage{array}. – Svend Tveskæg Dec 14 '14 at 15:35\mbox{...}removed in favor of{...}. – Heiko Oberdiek Dec 14 '14 at 16:26\SI{80}{\percent}was tricky, because optiondetect-weightdid not work inside anS-column. Also en dash fixed to em dash.*{<n>}{...}is practical here, but it has the disadvantage, that the format of a single column cannot be easily changed. Packagearrayis loaded bysiunitx, thus it does not matter much, if is is loaded explicitly. – Heiko Oberdiek Dec 14 '14 at 16:30[b]and the[c]in\newcommand*{\specialcell}[2][b]{...and\newcommand{\specialcellbold}[2][c]{...– thymaro Sep 28 '17 at 09:44[b]and[c]are the default values for the first parameter of\specialcellthat is then passed as first optional argument for\begin{tabular}with meaning vertical alignment (b= bottom,c= centered). – Heiko Oberdiek Sep 28 '17 at 17:23