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.