Try with a consistent transpose:
figure('Name','Conditional and unconditional variance decomposition')
horizon_titles={'1-period','4-period','8-period','16-period','40-period'};
for k=1:size(oo_.conditional_variance_decomposition,2)
subplot(2,3,k)
ba=bar(squeeze(oo_.conditional_variance_decomposition(:,k,:)*100),'stacked','FaceColor','flat');
ba(:,1).CData=[0 1 1];
ba(:,2).CData=[1 0 1];
ba(:,3).CData=[0.0 0.1 0.5];
ba(:,4).CData=[1 1 0];
ba(:,5).CData=[0.3020 0.7451 0.9333];
ba(:,6).CData=[0.9882 0.8314 0.3569];
ba(:,7).CData=[1.0000 0.0745 0.6510];
vd_2d=squeeze(oo_.conditional_variance_decomposition(:,k,:))'*100;
if any(vd_2d>0.3)
xbarCnt = vertcat(ba.XEndPoints);
ybarTop = vertcat(ba.YEndPoints);
ybarCnt = ybarTop - vd_2d/2;
txt = compose('%.1f%%',vd_2d);
th = text(xbarCnt(:), ybarCnt(:), txt(:),'HorizontalAlignment', 'center', ....
'VerticalAlignment', 'middle', 'Color', 'k','FontSize', 8);
else;
end
xticklabels({'interest rate','investment','price of capital','capital','inflation','wage','consumption','output','labor','rental rate of capital'});
ylim([0 120]);
title(horizon_titles{k})
set(gca,'FontSize',10, 'FontName','Times','FontWeight','normal');
if k==1
Lgnd=legend('productivitiy shock','preference','government spending','investment','monetary policy','price markup','wage markup');
set(Lgnd, 'FontSize',10,'FontWeight','Normal','FontName','Times','Orientation','horizontal');
end
end