I've adapted my recursion code from this polygon related answer. I've removed the whole spiel about drawDist and shiftDist because they make things more complicated than they have to be.
The line width of the two rectangles gets halfed with each deeper level. This is done by
line width=.4pt/2^(\pgfkeysvalueof{/tikz/flakes/level'}-1)
where /tikz/flakes/level' is basically a counter that counts up the deeper we are (whereas level counts down). The default line width thin is 0.4pt which is what I've used here as a starting line width.
Code
\documentclass[tikz]{standalone}
\usepgfkeyslibrary{ext.pgfkeys-plus}
\makeatletter
\pgfqkeys{/handlers}{
.foreach/.code={\let\pgfkeys@exp@call@\pgfkeys@exp@call
\foreach\pgf@keys@temp in{#1}{\expandafter\pgfkeys@exp@call@\expandafter{\pgf@keys@temp}}}}
\makeatother
\newcommand*\flakesset{\pgfqkeys{/tikz/flakes}}
\newcommand*\flakescreate[1][]{\begingroup\flakesset{#1,start}\endgroup}
\flakesset{% adapted from https://tex.stackexchange.com/a/685124
.code=\flakesset{#1}, tikz/.code=\tikzset{#1},
level/.initial=0, level'/.initial=0, item/.initial=0,
start item/.initial=0, end item/.initial=3,
item list/.initial={\pgfkeysvalueof{/tikz/flakes/start item},...,\pgfkeysvalueof{/tikz/flakes/end item}},
start/.style={level'=0, item=0, tikz=flakes/at start/.try, __do=0},
__do/.style={
/utils/TeX/ifnum={\pgfkeysvalueof{/tikz/flakes/level}=0}{__place={#1}}{
level/.--, level'/.++, before split={#1},
__split/.foreach/.expanded={\pgfkeysvalueof{/tikz/flakes/item list}}}},
__split/.code={%
\pgfkeyssetevalue{/tikz/flakes/item}{#1}%
\tikzset{flakes/before do={#1}}%
\flakesset{__do={#1}}%
\tikzset{flakes/after do/.try={#1}}},
__place/.code={\path[flakes/styling={#1}](0,0)to[flakes/path={#1}](0,0);},
before split/.style={
level \pgfkeysvalueof{/tikz/flakes/level}/.try={#1},
level \pgfkeysvalueof{/tikz/flakes/level'}'/.try={#1}}}
%% Here starts your definitions
\flakesset{
hiermatrix/.style={
/tikz/my test/.style n args={3}{/utils/TeX/if=##1{##2}{##3}},
before do/.style 2 args={
shift={(##1.5,##2.5)}, scale=.5,
my test={##1##2}{% if ++ or -- place the drawing and stop recursions
/tikz/flakes/__place={##1##2},
/tikz/flakes/__do/.code=}{}},
styling/.style={
my flakes,
my test={##1}{line width=.4pt/2^(\pgfkeysvalueof{/tikz/flakes/level'}-1)}{}},
item list={++, -+, --, +-},
path/.style={
my test={##1}{% if ++ or -- draw two rectangles with border
to path={
(-1,-1) edge[to path=rectangle(\tikztotarget),thin,path only,draw] (1,1)
(-.75, -.5) rectangle ++(.25, 1.125) ++(right:.2) rectangle +(1, -.25)},
}{% otherwise just a rectangle
to path={(-1, -1) rectangle (1, 1)}}}}}
\begin{document}
\tikz[my flakes/.style={draw=black, fill=lightgray}]
\matrix[
column sep=5mm,
nodes={node font=\bfseries\sffamily,
node contents=(\pgfkeysvalueof{/tikz/flakes/level})},
cells={flakes/level/.expanded=\inteval{\pgfmatrixcurrentcolumn-1}}
]{
\path[my flakes] (-1,-1) rectangle (1,1); & \flakescreate[hiermatrix]
& \flakescreate[hiermatrix] & \flakescreate[hiermatrix] \
\node[]; & \node[]; & \node[]; & \node[];\};
\end{document}
Output
