To parse typical (especially Boolean logic) expressions, you hardly need a Peg parser; there's never really a need to backtrack.  Pick any parsing engine and use it (including a Peg engine if you insist).
Here's a grammar that will work for your example:
EXPRESSION = DISJUNCTION ;
DISJUNCTION = CONJUNCTION ( '|' CONJUNCTION )*;
CONJUNCTION = TERM ( '&' TERM );
TERM = '~' TERM | '(' EXPRESSION ')' | CONDITION ;
CONDITION = VARIABLE '=' CONSTANT ;
If you want to implement this grammar using a hand-written, recursive descent parser that is easy to code, see my SO answer on how to do this: Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
Regarding overflowing the stack:  unless your expression is nested hundreds of levels ("parentheses") deep, on most windows or linux system, the available stack is far bigger than the stack demands of a parser applied to expressions that people write in practice.  With huge expressions, pretty much people can't read them anyway so they don't occur.  OP's example expression requires nesting of just a few stack entries.
If you write a grammar for a full-fledged programming language, and somebody writes a big, complex program in that langauge, you might risk overflowing the stack.  I can tell you from experience with a compiler I built that a nesting of  256 (stack frames) fits easily in Windows 1Mb stack space, and that's enough to compile 2 million line program with every strange construct and deeply nested lexical scoping stunt known to mankind in it.