The usual way to avoid precedence issues without lots of parentheses is to define some helpers, and that works here pretty nicely, to my eye:
val cond = "(" ~> stmt <~ ")"
val thenClause = "{" ~> stmt <~ "}"
val ifStmt = "if" ~> cond ~ thenClause ^^ { case s1 ~ s2 => If(s1, s2) }
If this wasn't an option for some reason, I'd definitely avoid your first approach, and I'd adjust the second to make the precedence-managing parentheses match up more cleanly with the syntax—i.e., something like this:
"if" ~> ("(" ~> stmt <~ ")") ~ ("{" ~> stmt <~ "}") ^^ {
case s1 ~ s2 => If(s1, s2)
}
This isn't great, but it's not absolutely unreadable, either.